<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: net_flow/event_set.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_460afd45d0ec637b1427e0e06a6fbcf7.html">net_flow</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">event_set.cpp</div></div>
</div><!--header-->
<div class="contents">
<a href="event__set_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#include &quot;<a class="code" href="node_8hpp.html">flow/net_flow/node.hpp</a>&quot;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span><span class="preprocessor">#include &quot;<a class="code" href="peer__socket_8hpp.html">flow/net_flow/peer_socket.hpp</a>&quot;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="preprocessor">#include &quot;<a class="code" href="server__socket_8hpp.html">flow/net_flow/server_socket.hpp</a>&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="preprocessor">#include &quot;<a class="code" href="async_2util_8hpp.html">flow/async/util.hpp</a>&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="preprocessor">#include &lt;boost/algorithm/cxx11/all_of.hpp&gt;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="preprocessor">#include &lt;boost/algorithm/cxx11/one_of.hpp&gt;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="preprocessor">#include &lt;boost/functional.hpp&gt;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span> </div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceflow_1_1net__flow.html">flow::net_flow</a></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span>{</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span> </div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span><span class="comment">// Event_set static initializations.</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span><span class="keyword">const</span> boost::unordered_map&lt;<a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71">Event_set::Event_type</a>, Function&lt;<a class="code hl_class" href="classbool.html">bool</a> (<span class="keyword">const</span> Node*, <span class="keyword">const</span> boost::any&amp;)&gt;&gt;</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span>        <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#aa321c69146b8575e4d0e3b15c67d4f08">Event_set::S_EV_TYPE_TO_IS_ACTIVE_NODE_MTD</a></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span>          ({</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span>             { <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71a7cedcbdde2b86daeb1268c63c6cb6b88">Event_set::Event_type::S_PEER_SOCKET_READABLE</a>, &amp;<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#aa44feae2c97b4bc1fe1f14f83e932d84">Node::sock_is_readable</a> },</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span>             { <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71a5efb94617bcb00507a087224ce7a7d02">Event_set::Event_type::S_PEER_SOCKET_WRITABLE</a>, &amp;<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a0756fc7301d0cfa66f19e681a9c60c06">Node::sock_is_writable</a> },</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span>             { <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71afb218b0110d3f9f26ee089bad2e0eba2">Event_set::Event_type::S_SERVER_SOCKET_ACCEPTABLE</a>, &amp;<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a51b26bff4cdf545f22d8edec7185c5c4">Node::serv_is_acceptable</a> }</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span>           });</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span> </div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span><span class="comment">// Event_set implementations.</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span> </div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a7b8e6cf7046b6905015301a203cd88f5">   42</a></span><a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a7b8e6cf7046b6905015301a203cd88f5">Event_set::Event_set</a>(<a class="code hl_class" href="classflow_1_1log_1_1Logger.html">log::Logger</a>* logger_ptr) :</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span>  log::Log_context(logger_ptr, <a class="code hl_enumeration" href="namespaceflow.html#a3938730ab4b89daf13d027a5f620e7ce">Flow_log_component</a>::S_NET_FLOW),</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span>  m_state(<a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975">State</a>::S_CLOSED), <span class="comment">// Incorrect; set explicitly.</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span>  m_node(0), <span class="comment">// Incorrect; set explicitly.</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span>  m_want(empty_ev_type_to_socks_map()), <span class="comment">// Each event type =&gt; empty socket set.</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span>  m_can(empty_ev_type_to_socks_map()), <span class="comment">// Ditto.</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span>  m_baseline_check_pending(false)</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span>{</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>  <span class="comment">// This can be quite frequent if program uses many sync_*() methods.  Use TRACE.</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;] created.&quot;</span>);</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span>}</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span> </div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#accb662e50999e2d0800f59a7a131bffa">   54</a></span><a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#accb662e50999e2d0800f59a7a131bffa">Event_set::~Event_set</a>()</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span>{</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span>  <span class="comment">// This can be quite frequent if program uses many sync_*() methods.  Use TRACE.</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;] destroyed.&quot;</span>);</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span>}</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span> </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a8453cccdaaf22ea6b027c5de9738f0f0">   60</a></span><a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975">Event_set::State</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a8453cccdaaf22ea6b027c5de9738f0f0">Event_set::state</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a>;</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span>}</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span> </div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#aafa4275ad4f93ae274f7f88fd257ce33">   66</a></span><a class="code hl_class" href="classflow_1_1net__flow_1_1Node.html">Node</a>* <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#aafa4275ad4f93ae274f7f88fd257ce33">Event_set::node</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af635301685a4a331142e1ac8a791a65d">m_node</a>;</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span>}</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span> </div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a43dfb881ab3a9488a6a60dd83ad21c85">   72</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a43dfb881ab3a9488a6a60dd83ad21c85">Event_set::async_wait</a>(<span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1Function.html">Event_handler</a>&amp; on_event, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span>{</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a43dfb881ab3a9488a6a60dd83ad21c85">async_wait</a>, on_event, _1);</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span> </div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span>  <span class="keyword">using </span>boost::algorithm::all_of;</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span> </div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span>  <span class="comment">// We are in user thread U != W.</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span> </div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span>  <span class="comment">/* Caller has loaded *this with desired events (socket + event type pairs); e.g., &quot;I want</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span><span class="comment">   * Peer_socket X to be Readable; I want Server_socket Y to be Acceptabe.&quot;  Now she wants to be</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span><span class="comment">   * informed as soon as one or more of those events has occurred (e.g., &quot;Server_socket Y is</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span><span class="comment">   * Acceptable.&quot;).  After being so informed, she can check which events did in fact occur and act</span></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span><span class="comment">   * accordingly (e.g., &quot;Server_socket Y is Acceptable, so I will call Y-&gt;accept()&quot;).</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span><span class="comment">   *</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span><span class="comment">   * Suppose we lock *this.  There are now several possitibilities.</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span><span class="comment">   *</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span><span class="comment">   *   -1- We are CLOSED.  Bail out: everything is blank in CLOSED state, and no further waits are</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span><span class="comment">   *       possible.</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span><span class="comment">   *   -2- We are WAITING.  Bail out: cannot wait while already WAITING: the on-event behavior</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span><span class="comment">   *       (i.e., on_event) has already been set, and we do not support dislodging it with another</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span><span class="comment">   *       handler.</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span><span class="comment">   *   -3- We are INACTIVE.  The mainstream case.  We should enter WAITING and inform the caller</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span><span class="comment">   *       (via on_event() call) as soon as at least one event has occurred.</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span><span class="comment">   *</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span><span class="comment">   * Obviously -3- is the interesting case.</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span><span class="comment">   *</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span><span class="comment">   * First, some groundwork.  The meaning of &quot;As soon as 1+ event has occurred&quot; is not totally</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span><span class="comment">   * clear-cut.  For example, it could mean &quot;the moment we know that exactly 1 event has occurred.&quot;</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span><span class="comment">   * However, a high-performance definition is: &quot;no later than time period E since the moment we</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span><span class="comment">   * know that exactly 1 event has occurred,&quot; where E is defined as &quot;the largest amount of time that</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span><span class="comment">   * can be considered &#39;non-blocking.&#39;&quot;  Informally, this just means that we should detect and</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span><span class="comment">   * accumulate (clump together) as many events as possible -- without extending the wait by a</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span><span class="comment">   * &quot;blocking&quot; time period -- before calling on_event() and thus &quot;giving the results&quot; to the user.</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span><span class="comment">   * This should result in a faster event loop for the user, but we may want to make it tunable.</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span><span class="comment">   *</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span><span class="comment">   * Supposing we want to &quot;clump together&quot; events this way, the problem reduces to 3 conceptual</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span><span class="comment">   * steps.  First, detect that exactly 1 desired event has fired; accumulate it.  Second, perform</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span><span class="comment">   * any immediately pending Node work, and accumulate any events thus fired.  Third, once that&#39;s</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span><span class="comment">   * done, call on_event() to inform the user.</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span><span class="comment">   *</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span><span class="comment">   * The latter two steps are interesting but can be left as black boxes for the time being.  What</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span><span class="comment">   * about the former, first, step?  How to detect that first event has occurred in a timely</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span><span class="comment">   * fashion?</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span><span class="comment">   *</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span><span class="comment">   * What we really are looking for is not so much an &quot;event&quot; but rather a CONDITION (e.g., &quot;Socket</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span><span class="comment">   * S is Writable&quot;), and we want to know the earliest moment in the future when this CONDITION is</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span><span class="comment">   * true.  (Time is always passing, so I say &quot;future&quot; instead of &quot;present or future.&quot;  Also we can</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span><span class="comment">   * assume, for our purposes, that the CONDITION cannot become false after it is true.)  One</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span><span class="comment">   * guaranteed way to detect this, which is what we&#39;ll use, is as follows.  At the soonest moment</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span><span class="comment">   * possible from now, check whether the CONDITION is true. At that point, if it is true, we&#39;ve</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span><span class="comment">   * found the one &quot;event&quot; that has occurred and can immediately proceed.  If, at that point, it is</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span><span class="comment">   * not true, then we check at every step when the CONDITION *may* become true -- that is, when the</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span><span class="comment">   * underlying logic changes what the CONDITION is about -- and if it is at that point true, we can</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span><span class="comment">   * proceed.  In other words, establish a baseline (&quot;CONDITION is currently false&quot;), and then</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span><span class="comment">   * ignore the whole thing except at time points when CONDITION may deviate from that baseline.</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span><span class="comment">   * This is efficient and works.</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span><span class="comment">   *</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span><span class="comment">   * We call the initial check, right after async_wait() is called, the &quot;baseline&quot; check; while the</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span><span class="comment">   * subsequent checks are called &quot;delta&quot; checks.  (Known terms for this are &quot;level&quot; check and</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span><span class="comment">   * &quot;edge&quot; check, but I didn&#39;t know that when originally writing this giant comment.  @todo Change</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span><span class="comment">   * terminology in comments and code.)</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span><span class="comment">   *</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span><span class="comment">   * To be specific, consider the CONDITION &quot;Server_socket S is Acceptable&quot; as an example.  First we</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span><span class="comment">   * check ASAP: is S Acceptable -- i.e., does it have at least one Peer_socket on its accept queue?</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span><span class="comment">   * Yes?  Done.  No?  OK.  &lt;time passes&gt;  Say we get a valid SYN_ACK_ACK on that port.  Since</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span><span class="comment">   * receiving a SYN_ACK_ACK on socket S&#39; belonging to Server_socket S is the only way S can become</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span><span class="comment">   * Acceptable, we check it.  Is it?  Yes.  Done.  At all other points in time we don&#39;t concern</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span><span class="comment">   * ourselves with the CONDITION/event &quot;Server_socket S is Acceptable.&quot;</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span><span class="comment">   *</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span><span class="comment">   * The above may be seen as obvious, but it&#39;s important to be very explicit for the following</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span><span class="comment">   * reasoning to work.  It&#39;s pretty clear that the &quot;delta&quot; checking can only occur on thread W;</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span><span class="comment">   * only Node on thread W knows about such things as receiving SYN_ACK_ACKs, for example.  What</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span><span class="comment">   * about the &quot;baseline&quot; (initial) check for the CONDITION in question?  There are two</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span><span class="comment">   * possibilities.  One is we can do it right here, right now, in thread U != W.  The other is we</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span><span class="comment">   * can post() a task onto thread W and have it happen there ASAP.</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span><span class="comment">   *</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span><span class="comment">   * The former (do it here) seems attractive.  It&#39;s &quot;faster,&quot; in that we can just do it now.  It</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span><span class="comment">   * also lets us short-circuit on_event() and just return something to the user right now, so they</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span><span class="comment">   * can instantly react (in case one of the events is immediately true) instead of having to learn</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span><span class="comment">   * of the event indirectly.  It&#39;s also more distributed among threads in some situations (we&#39;re</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span><span class="comment">   * loading less work onto one thread W, which may be busy keeping net_flow working).  The negative is</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span><span class="comment">   * we generally prefer to keep work on W when it doesn&#39;t seriously hurt performance, to keep the</span></div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span><span class="comment">   * synchronization as simple as possible (avoid bugs); for example that&#39;s why Node::listen() and</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span><span class="comment">   * Node::connect() and Event_set::close() work the way they do (using futures).  Another negative</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span><span class="comment">   * is that it introduces a special case to the interface; so the user would need to write code to</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span><span class="comment">   * handle both an instant, non-error return and one via on_event().</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span><span class="comment">   *</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span><span class="comment">   * I thought about this for a while.  I&#39;d go for the faster way, but the real crux is how to set</span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span><span class="comment">   * up the synchronization in a way that would not miss events.  I 90% convinced myself that a</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span><span class="comment">   * certain not-hard way would be correct, but it remains difficult to think about; eventually I</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="comment">   * decided that it would be best to go with the slower solution (do both &quot;baseline&quot; and &quot;delta&quot;</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span><span class="comment">   * checks on W), because of its simplicity and elegance.  I doubt the performance impact is too</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span><span class="comment">   * serious.  On 5-year old server hardware in 2012, assuming an idle thread W and a ready socket event, a</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span><span class="comment">   * return through post(W) + on_event() { boost::promise::set_value() } is in the low hundreds of</span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span><span class="comment">   * microseconds.  If on_event() instead sends a message through a Unix domain socket, doing that</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span><span class="comment">   * and detecting and reading that message is in the same ballpark (certainly sub-millisecond).</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span><span class="comment">   * Effectively adding sub-ms latency to some messages does not seem too bad.</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span><span class="comment">   *</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span><span class="comment">   * Conclusion: Lock *this; then filter out CLOSED and WAITING state.  Then, assuming INACTIVE</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span><span class="comment">   * state, proceed to WAITING state.  post() onto thread W the &quot;baseline check&quot; task.  Finally,</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span><span class="comment">   * unlock *this.  Thread W will then proceed with &quot;baseline&quot; and &quot;delta&quot; checks and will fire</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span><span class="comment">   * on_event() when ready.</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span><span class="comment">   *</span></div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span><span class="comment">   * Also note that poll() provides the &quot;instantly check for any of the desired events and don&#39;t</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span><span class="comment">   * wait&quot; functionality in isolation (something like a select() with a 0 timeout). */</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span> </div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span>  <span class="comment">// Lock everything.  We&#39;re going to be writing to things other user threads and W will be accessing/writing.</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span> </div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span>  <span class="comment">// Check for invalid arguments, basically.</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span>  <span class="keywordflow">if</span> (all_of(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af4fa5dbda4ffd95b35dee57fc01b90ce">m_want</a>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#aed9505b886c78169fe35b527f4e01855">ev_type_to_socks_map_entry_is_empty</a>))</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span>  {</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482a5cbb0762dc20632c76db479f40237492">error::Code::S_EVENT_SET_NO_EVENTS</a>);</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span>  }</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span> </div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">State::S_CLOSED</a>)</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span>  {</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span>    <span class="comment">// Already CLOSED Event_set -- Node has disowned us.  Mark error in *err_code and log.</span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span>    assert(!<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af635301685a4a331142e1ac8a791a65d">m_node</a>);</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span> </div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae643fd244bd1d6b483295cb9f356b0ae">error::Code::S_EVENT_SET_CLOSED</a>);</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span>  }</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span> </div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">State::S_WAITING</a>)</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span>  {</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span>    <span class="comment">// Someone already started an async_wait().</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482adccb025a96014a74a1435481ec2b58ac">error::Code::S_EVENT_SET_DOUBLE_WAIT_OR_POLL</a>);</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span>  }</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span>  <span class="comment">// else the mainstream case.</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span>  assert(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">State::S_INACTIVE</a>);</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span> </div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span>  <span class="comment">// Forward to Node, as is the general pattern for Event_set method implementations involving Node state.</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span>  <span class="keywordflow">return</span> <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af635301685a4a331142e1ac8a791a65d">m_node</a>-&gt;<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#aa18a14a4749f34d07c71bb2a1214d65f">event_set_async_wait</a>(shared_from_this(), <span class="comment">// Get a Ptr that shares ownership of this.</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span>                                      on_event, err_code);</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span>} <span class="comment">// Event_set::async_wait()</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span> </div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a3122100c044da08495fac737998f60db">  214</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a3122100c044da08495fac737998f60db">Event_set::async_wait_finish</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span>{</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a3122100c044da08495fac737998f60db">async_wait_finish</a>, _1);</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span> </div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span> </div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span>  <span class="comment">/* User wants to move *this to INACTIVE state, so that she can check the results of a wait (in</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span><span class="comment">   * m_can).  If it is already in INACTIVE, then this won&#39;t do anything but is allowed (for</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span><span class="comment">   * reasons that will be very soon clear).  If it is CLOSED, then it&#39;s just an error like any other</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span><span class="comment">   * operation.</span></div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span><span class="comment">   *</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span><span class="comment">   * If it is WAITING, then there&#39;s a race.  We&#39;re about to lock *this and try to change to INACTIVE</span></div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span><span class="comment">   * if needed.  If we lose the race -- if Node in thread W is able to, while scanning Event_sets</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span><span class="comment">   * for applicable events that just occurred, lock *this and find some active events in *this and</span></div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span><span class="comment">   * thus change m_state to INACTIVE -- then that&#39;s just the NOOP situation for us (INACTIVE -&gt;</span></div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span><span class="comment">   * INACTIVE).  No harm done; *this is still INACTIVE by the time we return, as advertised.  If we</span></div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span><span class="comment">   * win the race -- if we lock and change state to INACTIVE -- then Node will just ignore *this</span></div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span><span class="comment">   * when/if it gets to it, as user is no longer interested in *this&#39;s events (which is correct). */</span></div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span> </div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span>  <span class="comment">// Lock everything, as we&#39;ll be reading/changing m_state at least.</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span> </div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">State::S_CLOSED</a>)</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span>  {</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span>    <span class="comment">// Already CLOSED Event_set -- Node has disowned us.  Mark error in *err_code and log.</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae643fd244bd1d6b483295cb9f356b0ae">error::Code::S_EVENT_SET_CLOSED</a>);</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span>  }</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span> </div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">State::S_WAITING</a>)</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span>  {</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span>    <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;] wait finish requested; moving from &quot;</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span>                   <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a> &lt;&lt; <span class="stringliteral">&quot;] to [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">Event_set::State::S_INACTIVE</a> &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span> </div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span>    <span class="comment">// As in event_set_fire_if_got_events():</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span>    <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a59f6ddb0d0258cc029c435a8ed0f89f7">m_on_event</a>.clear();</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span>    <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> = <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">State::S_INACTIVE</a>;</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span>  }</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span>  {</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span>    assert(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">State::S_INACTIVE</a>);</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span>    <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;] wait finish requested, but state was already &quot;</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span>                   <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">Event_set::State::S_INACTIVE</a> &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span>  }</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span> </div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">  261</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span>} <span class="comment">// Event_set::async_wait_finish()</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span> </div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a412214de6a4f3a1ff1e86ddb1975f47b">  265</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a412214de6a4f3a1ff1e86ddb1975f47b">Event_set::poll</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span>{</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a412214de6a4f3a1ff1e86ddb1975f47b">poll</a>, _1);</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span> </div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span> </div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span>  <span class="comment">/* This method can be thought of as sync_wait() with a zero max_wait (which sync_wait() actually</span></div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span><span class="comment">   * disallows, so that poll() is used instead), with the minor difference that the &quot;no events ready &#39;in time&#39;&quot; result</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span><span class="comment">   * for us means we return `true` (no error) and `!*err_code` (sync_wait() returns a ..._TIMEOUT err_code).</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span><span class="comment">   *</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span><span class="comment">   * It assumes INACTIVE state, goes WAITING, checks</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span><span class="comment">   * for any of the m_want conditions that are true right now (and saves such to m_can), then</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span><span class="comment">   * immediately goes back to INACTIVE.  If you look at the giant comment in async_wait() you&#39;ll</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span><span class="comment">   * note that this is basically equivalent to an async_wait() that performs only the initial</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span><span class="comment">   * (&quot;baseline&quot;) check and then immediately goes back to INACTIVE regardless of whether the</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span><span class="comment">   * baseline check discovered any active events.</span></div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span><span class="comment">   *</span></div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span><span class="comment">   * The only difference is that we do the baseline check directly in thread U != W, as opposed to</span></div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span><span class="comment">   * post()ing it onto thread W.  It is entirely thread-safe to check each event from thread U, as</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span><span class="comment">   * all the event checking functions (is Readable?  is Writable?  is Acceptable?) explicitly can</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span><span class="comment">   * run from any thread.  Additionally, the argument made (in the async_wait() comment) against</span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span><span class="comment">   * performing the baseline check in thread U != W does not apply: we&#39;re not interested in</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span><span class="comment">   * performing any blocking, so we can&#39;t &quot;miss&quot; any events as long as we simply check immediately.</span></div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span><span class="comment">   * Of course, the result is faster and simpler code as well (compared to post()ing it). */</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span> </div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span>  <span class="comment">// Lock everything, as we&#39;ll be reading/changing much state.</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span> </div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">State::S_CLOSED</a>)</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span>  {</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span>    <span class="comment">// Already CLOSED Event_set -- Node has disowned us.  Mark error in *err_code and log.</span></div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae643fd244bd1d6b483295cb9f356b0ae">error::Code::S_EVENT_SET_CLOSED</a>);</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span>  }</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span> </div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">State::S_WAITING</a>)</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span>  {</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span>    <span class="comment">// Fairly similar situation to trying to async_wait() while WAITING.</span></div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482adccb025a96014a74a1435481ec2b58ac">error::Code::S_EVENT_SET_DOUBLE_WAIT_OR_POLL</a>);</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span>  }</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span>  assert(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">State::S_INACTIVE</a>);</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span> </div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span>  <span class="comment">/* Perform baseline check (that is to say, simply check each event in m_want and if it holds,</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span><span class="comment">   * add it to m_can). */</span></div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span> </div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span>  <span class="comment">// This is a formality, as we&#39;ll just go back to INACTIVE in a moment, but event_set_baseline_check() expects it.</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span>  <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> = <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">State::S_WAITING</a>;</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span> </div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span>  <span class="comment">// As in a regular async_wait():</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">clear_ev_type_to_socks_map</a>(&amp;<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#abf8a102c621b1536659973b2d6b33822">m_can</a>);</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span>  <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#ada8d103341b6450f3390dc6ce24ccdef">m_baseline_check_pending</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span> </div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> baseline_check_ok =</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span>    <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af635301685a4a331142e1ac8a791a65d">m_node</a>-&gt;<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a2195fb7d86acfaf340b3e7e59e7e10e8">event_set_check_baseline</a>(shared_from_this());</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span>  assert(baseline_check_ok); <span class="comment">// There is NO adequate reason for it to fail; we&#39;ve set m_baseline_check_pending = true.</span></div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span> </div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span>  <span class="comment">// As in a regular async_wait_finish() (but no need to mess with m_on_event, as we didn&#39;t set it above):</span></div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span>  <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> = <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">State::S_INACTIVE</a>;</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span> </div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span>  <span class="comment">// Done.  m_can sets are what they are.</span></div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span>} <span class="comment">// Event_set::poll()</span></div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span> </div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a13a17c404f0ce43da5fec53a550da9be">  335</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a13a17c404f0ce43da5fec53a550da9be">Event_set::sync_wait_impl</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a>&amp; max_wait, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>{</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>  <span class="keyword">using </span>boost::promise;</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span>  <span class="keyword">using </span>boost::unique_future;</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span>  <span class="keyword">using </span>boost::future_status;</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span>  <span class="keyword">using </span>boost::chrono::milliseconds;</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span>  <span class="keyword">using </span>boost::chrono::round;</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span>  <span class="keyword">using </span>boost::algorithm::one_of;</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span> </div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span>  assert(max_wait.count() &gt; 0);</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span> </div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span>  <span class="comment">// We are in user thread U != W.</span></div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span> </div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span>  <span class="comment">/* This is actually simple.  They want us to block until 1+ of the desired events loaded into</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span><span class="comment">   * m_want has occurred.  Therefore we use async_wait(), and have thread W signal us when this</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span><span class="comment">   * has occurred; then in this thread we wait for that signal.  So how to signal?  We can use</span></div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span><span class="comment">   * Boost future (internally condition_variable probably).</span></div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span><span class="comment">   *</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span><span class="comment">   * Additional optimization: perform a single poll() right away, in case events are ready now.</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span><span class="comment">   * This lets us avoid any thread W work and return immediately. */</span></div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span> </div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span>  {</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span>    <span class="comment">// Lock so that we can safely check result of the poll() without another thread messing with it.</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span>    <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>); <span class="comment">// OK because m_mutex is recursive (poll() will also momentarily lock).</span></div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span> </div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span>    <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a412214de6a4f3a1ff1e86ddb1975f47b">poll</a>(err_code)) <span class="comment">// May throw.</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span>    {</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// *err_code set (if not null)/logged.</span></div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span>    }</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span>    <span class="comment">// else see if already a least one exists for at least one of the event types.</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span>    <span class="keywordflow">if</span> (one_of(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#abf8a102c621b1536659973b2d6b33822">m_can</a>, boost::not1(<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#aed9505b886c78169fe35b527f4e01855">ev_type_to_socks_map_entry_is_empty</a>)))</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span>    {</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span>      <span class="comment">// Boo-ya, immediately found some active events.</span></div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span>      <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span>    }</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span>    <span class="comment">// else need to wait.</span></div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span>  }</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span> </div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span>  <span class="comment">/* We will perform the wait via the future/promise pair. The result of the successful operation is either true or</span></div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span><span class="comment">   * false: interrupted (true) or condition(s) now true (false). */</span></div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span>  promise&lt;bool&gt; intr_promise; <span class="comment">// This will be touched by thread W when events ready.</span></div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span>  unique_future&lt;bool&gt; intr_future = intr_promise.get_future(); <span class="comment">// We&#39;ll use this to wait for that.</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span> </div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span>  <span class="comment">/* The on-event callback is therefore: intr_promise-&gt;set_value(interrupted),</span></div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span><span class="comment">   * where interrupted is boolean value async_wait() will pass in, indicating whether the wait was finished</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span><span class="comment">   * due to an explicit interruption (true) vs. the waited-on condition(s) actually becoming true (false).</span></div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span><span class="comment">   * Capture intr_promise by reference, as we will for completion, during which time it&#39;ll keep existing. */</span></div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span>  <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a43dfb881ab3a9488a6a60dd83ad21c85">async_wait</a>([&amp;intr_promise](<span class="keywordtype">bool</span> interrupted) { intr_promise.set_value(interrupted); },</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span>                  err_code)) <span class="comment">// May throw.</span></div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span>  {</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span>    <span class="comment">// Was not able to start the asynchronous wait; *err_code set (if not null)/logged.</span></div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span>  }</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span>  <span class="comment">// else *err_code is success (or untouched if null).</span></div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span> </div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span>  <span class="keywordtype">bool</span> timed_out = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span> </div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span>  <span class="comment">// Block until intr_promise is touched.</span></div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span>  <span class="keywordflow">if</span> (max_wait == Fine_duration::max())</div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span>  {</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span>    <span class="comment">// Infinite wait.</span></div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span>    intr_future.wait();</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span>  }</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span>  {</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span>    <span class="comment">// Finite wait.</span></div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span> </div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span>    <span class="keywordflow">if</span> (intr_future.wait_for(max_wait) != future_status::ready)</div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span>    {</div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span>      <span class="comment">/* Timed out.  That&#39;s OK: we treat it the same way as if hadn&#39;t timed out; we&#39;ll simply</span></div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span><span class="comment">       * return 0 active events, not an error.  Therefore we need only finish the wait by going to</span></div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span><span class="comment">       * INACTIVE state using async_wait_finish().  Then if/when Node decides to actually add an</span></div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span><span class="comment">       * active event to *this, *this will already be INACTIVE, so Node will ignore it (which is</span></div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span><span class="comment">       * right).</span></div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span><span class="comment">       *</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span><span class="comment">       * Note that in the tiny period of time between wait_for() exiting with false and us</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span><span class="comment">       * calling async_wait_finish(), Node in thread W may actually be able to detect an event,</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span><span class="comment">       * add it to m_can, and go to INACTIVE.  This would mean that in async_wait_finish() we&#39;ll</span></div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span><span class="comment">       * try to go from INACTIVE to INACTIVE.  That is OK; that method specifically supports</span></div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span><span class="comment">       * that.  In that case it won&#39;t do anything, still return succes, and we&#39;ll happily return 1</span></div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span><span class="comment">       * or more active events inm_can, as if there was no timeout after all. */</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span> </div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span>      <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;Synchronous wait on Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;] timed out; &quot;</span></div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span>                    <span class="stringliteral">&quot;timeout = [&quot;</span> &lt;&lt; round&lt;milliseconds&gt;(max_wait) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span> </div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span>      <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a3122100c044da08495fac737998f60db">async_wait_finish</a>(err_code)) <span class="comment">// May throw.</span></div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span>      {</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span>        <span class="comment">// Extraordinary situation -- *this was close()d or something.  *err_code set (if not null)/logged.</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span>        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span>      }</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span>      <span class="comment">// else *err_code is still success (or untouched if null).</span></div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span> </div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span>      timed_out = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span>    } <span class="comment">// if (intr_future timed out)</span></div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span>  } <span class="comment">// else if (needed to wait until a deadline)</span></div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span> </div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span>  <span class="keywordflow">if</span> (!timed_out)</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span>  {</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span>    <span class="comment">/* The wait didn&#39;t time out (if that was even possible); but the result may have been that the (successful, from</span></div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span><span class="comment">     * async_wait()&#39;s point of view) wait finished due an interruption as opposed to the waited-on condition(s) becoming</span></div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span><span class="comment">     * true. In this case, as advertised, we return a specific error. This is conceptually similar to POSIX&#39;s</span></div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span><span class="comment">     * errno=EINTR semantics. */</span></div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span> </div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span>    <span class="keywordflow">if</span> (intr_future.get())</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span>    {</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span>      <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;Synchronous wait on Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;] was interrupted.&quot;</span>);</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span> </div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span>      <span class="keywordflow">if</span> (err_code)</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span>      {</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span>        *err_code = <a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ab92ec3b2b78d74acf0fda0786f601df5">error::Code::S_WAIT_INTERRUPTED</a>;</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span>      }</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span> </div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span>    }</div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span>    <span class="comment">// else if (conditions(s) are actually true)</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span>  }</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span> </div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span>  <span class="comment">// Caller can now examine m_can for fired events (if any).</span></div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span>  assert((!err_code) || (!*err_code)); <span class="comment">// Either null or success.</span></div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span>} <span class="comment">// Event_set::sync_wait_impl()</span></div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span> </div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a133c518168fe3922ab6729a99077dd3f">  457</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a133c518168fe3922ab6729a99077dd3f">Event_set::sync_wait</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span>{</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span>  <span class="keyword">using </span>boost::chrono::microseconds;</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span>  <span class="keywordflow">return</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a133c518168fe3922ab6729a99077dd3f">sync_wait</a>(microseconds(microseconds::max()), err_code); <span class="comment">// Wait indefinitely.  May throw.</span></div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span>}</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span> </div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a9ae292072a84d07c867536e3de3b878e">  463</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a9ae292072a84d07c867536e3de3b878e">Event_set::close</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span>{</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span>  <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceflow_1_1error.html#a48afa7f8c2e100acd461365dfb00a114">flow::error::exec_void_and_throw_on_error</a>([<span class="keyword">this</span>](<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* actual_err_code) { <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a9ae292072a84d07c867536e3de3b878e">close</a>(actual_err_code); },</div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span>                                                err_code, <a class="code hl_define" href="util__fwd_8hpp.html#a0cc4c82ac54e53b7a8a2431b66ff30df">FLOW_UTIL_WHERE_AM_I_STR</a>()))</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span>  {</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span>  }</div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span> </div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span>  <span class="comment">// We are in user thread U != W.</span></div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span> </div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>); <span class="comment">// Lock m_node/m_state; also it&#39;s a pre-condition for Node::event_set_close().</span></div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span> </div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno">  476</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">State::S_CLOSED</a>)</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span>  {</div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span>    <span class="comment">// Already CLOSED Event_set -- Node has disowned us.</span></div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span>    assert(!<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af635301685a4a331142e1ac8a791a65d">m_node</a>);</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span> </div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span>    <span class="comment">// Mark error in *err_code and log.</span></div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae643fd244bd1d6b483295cb9f356b0ae">error::Code::S_EVENT_SET_CLOSED</a>);</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span>  }</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span> </div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span>  <span class="comment">// Forward to Node, as is the general pattern for Event_set method implementations involving Node state.</span></div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span>  lock.release(); <span class="comment">// Let go of the mutex (mutex is still LOCKED).  event_set_close is now in charge of unlocking it.</span></div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span>  <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af635301685a4a331142e1ac8a791a65d">m_node</a>-&gt;<a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a44ee0d42d38f3b98d032dee1549f8c4c">event_set_close</a>(shared_from_this(), <span class="comment">// Get a Ptr that shares ownership of this.</span></div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span>                           err_code);</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span>} <span class="comment">// Event_set::close()</span></div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span> </div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a6e47fc394c09acf4d100a640e090a7aa">  492</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a6e47fc394c09acf4d100a640e090a7aa">Event_set::swap_wanted_sockets</a>(<a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Sockets</a>* target_set, <a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71">Event_type</a> ev_type, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span>{</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a6e47fc394c09acf4d100a640e090a7aa">swap_wanted_sockets</a>, target_set, ev_type, _1);</div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span> </div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span>  <span class="comment">/* @todo There are about 4 methods that have a pattern similar to below, differing mostly by log message</span></div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span><span class="comment">   * contents and what happens just before `return true`. Perhaps code reuse? */</span></div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span> </div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span> </div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span>  assert(target_set);</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span> </div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno">  504</span>  <span class="comment">// Accessing m_state, socket sets, etc. which may be written by other threads at any time.  Must lock.</span></div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span> </div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span>  <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Sockets</a>&amp; want_set = <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af4fa5dbda4ffd95b35dee57fc01b90ce">m_want</a>[ev_type];</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span> </div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Wanted set for event type [&quot;</span> &lt;&lt; ev_type &lt;&lt; <span class="stringliteral">&quot;] swapped in Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]; pre-swap sizes: &quot;</span></div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno">  510</span>                 <span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; want_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#ad2ce3ff8f57696dcb230f419775ab865">size</a>() &lt;&lt; <span class="stringliteral">&quot;]; user [&quot;</span> &lt;&lt; target_set-&gt;<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#ad2ce3ff8f57696dcb230f419775ab865">size</a>() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span> </div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span>  <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a8e16d91f81860eb2a6c971863548e466">ok_to_mod_socket_set</a>(err_code)) <span class="comment">// Ensure we can modify want_set in this state.</span></div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span>  {</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span>    <span class="comment">// *err_code is set.</span></div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// Closed; do not set *target_set (BTW want_set is blank anyway).</span></div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span>  }</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span>  <span class="comment">// else *err_code is success.</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span> </div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno">  519</span>  <span class="comment">// This is an O(1) operation.</span></div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span>  target_set-&gt;<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#a46e27b1b9b75e5dc890af26f85956190">swap</a>(want_set);</div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span> </div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno">  522</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span>} <span class="comment">// Event_set::swap_wanted_sockets()</span></div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span> </div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a86ddd6fb8874d85869157bae2ffda69b">  525</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a86ddd6fb8874d85869157bae2ffda69b">Event_set::clear_wanted_sockets</a>(<a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71">Event_type</a> ev_type, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span>{</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a86ddd6fb8874d85869157bae2ffda69b">clear_wanted_sockets</a>, ev_type, _1);</div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno">  528</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span> </div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span> </div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span>  <span class="comment">// Accessing m_state, the sets, etc. which may be written by other threads at any time.  Must lock.</span></div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno">  533</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno">  534</span> </div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span>  <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Sockets</a>&amp; want_set = <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af4fa5dbda4ffd95b35dee57fc01b90ce">m_want</a>[ev_type];</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span> </div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno">  537</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Wanted set for event type [&quot;</span> &lt;&lt; ev_type &lt;&lt; <span class="stringliteral">&quot;] cleared in Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno">  538</span>                 <span class="stringliteral">&quot;size [&quot;</span> &lt;&lt; want_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#ad2ce3ff8f57696dcb230f419775ab865">size</a>() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span> </div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno">  540</span>  <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a8e16d91f81860eb2a6c971863548e466">ok_to_mod_socket_set</a>(err_code)) <span class="comment">// Ensure we can modify can_set in this state.</span></div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span>  {</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno">  542</span>    <span class="comment">// *err_code is set.</span></div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// Closed; do not clear (it should be cleared anyway, BTW).</span></div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span>  }</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno">  545</span>  <span class="comment">// else *err_code is success.</span></div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno">  546</span> </div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span>  want_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#a8844c7594a079eb2d52d78436ed832c6">clear</a>();</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span>}</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span> </div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a976144f6e525190344eb4e51620f9fd9">  551</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a976144f6e525190344eb4e51620f9fd9">Event_set::events_wanted</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)<span class="keyword"> const</span></div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno">  552</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a976144f6e525190344eb4e51620f9fd9">events_wanted</a>, _1);</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno">  555</span> </div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span>  <span class="keyword">using </span>boost::algorithm::one_of;</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span> </div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno">  558</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno">  559</span> </div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span>  <span class="comment">// Lock everything, as we&#39;ll be reading state and other things.</span></div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span> </div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno">  563</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">State::S_CLOSED</a>)</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno">  564</span>  {</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span>    <span class="comment">// Already CLOSED Event_set -- Node has disowned us.  Mark error in *err_code and log.</span></div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae643fd244bd1d6b483295cb9f356b0ae">error::Code::S_EVENT_SET_CLOSED</a>);</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno">  568</span>  }</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span> </div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span>  <span class="keywordflow">return</span> one_of(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af4fa5dbda4ffd95b35dee57fc01b90ce">m_want</a>, boost::not1(<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#aed9505b886c78169fe35b527f4e01855">ev_type_to_socks_map_entry_is_empty</a>));</div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno">  572</span>} <span class="comment">// Event_set::events_wanted()</span></div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno">  573</span> </div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a314635daf8fdf3805868baff8b42cfc9">  574</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a314635daf8fdf3805868baff8b42cfc9">Event_set::events_detected</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)<span class="keyword"> const</span></div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno">  576</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a314635daf8fdf3805868baff8b42cfc9">events_detected</a>, _1);</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno">  577</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno">  578</span> </div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno">  579</span>  <span class="keyword">using </span>boost::algorithm::one_of;</div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno">  580</span> </div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno">  581</span>  <span class="comment">// We are in thread U != qW.</span></div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno">  582</span> </div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno">  583</span>  <span class="comment">// Lock everything, as we&#39;ll be reading state.</span></div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno">  584</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno">  585</span> </div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno">  586</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">State::S_CLOSED</a>)</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno">  587</span>  {</div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span>    <span class="comment">// Already CLOSED Event_set -- Node has disowned us.  Mark error in *err_code and log.</span></div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae643fd244bd1d6b483295cb9f356b0ae">error::Code::S_EVENT_SET_CLOSED</a>);</div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno">  590</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span>  }</div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span> </div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno">  594</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">State::S_WAITING</a>)</div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span>  {</div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno">  596</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482a3e273da0f7d2f231dbfaab8d07fd5ecd">error::Code::S_EVENT_SET_RESULT_CHECK_WHEN_WAITING</a>);</div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span>  }</div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno">  599</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span>  assert(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">State::S_INACTIVE</a>);</div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span> </div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span>  <span class="comment">// Coolio.</span></div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno">  603</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span> </div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Wait result set checked for activity in Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno">  606</span>                 <span class="stringliteral">&quot;results set sizes = [&quot;</span> &lt;&lt; <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a19e241ae4dfe1ea54de6027052bc2135">ev_type_to_socks_map_sizes_to_str</a>(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#abf8a102c621b1536659973b2d6b33822">m_can</a>) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno">  607</span> </div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno">  608</span>  <span class="keywordflow">return</span> one_of(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#abf8a102c621b1536659973b2d6b33822">m_can</a>, boost::not1(<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#aed9505b886c78169fe35b527f4e01855">ev_type_to_socks_map_entry_is_empty</a>));</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno">  609</span>} <span class="comment">// Event_set::events_detected()</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno">  610</span> </div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a72b26f25a2e76e3c61b4760b59de5b25">  611</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a72b26f25a2e76e3c61b4760b59de5b25">Event_set::emit_result_sockets</a>(<a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Sockets</a>* target_set, <a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71">Event_type</a> ev_type, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno">  612</span>{</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno">  613</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a72b26f25a2e76e3c61b4760b59de5b25">emit_result_sockets</a>, target_set, ev_type, _1);</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno">  614</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno">  615</span> </div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno">  616</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno">  617</span> </div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno">  618</span>  assert(target_set);</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno">  619</span> </div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno">  620</span>  <span class="comment">// Accessing m_state, the sets, etc. which may be written by other threads at any time.  Must lock.</span></div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno">  621</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno">  622</span> </div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno">  623</span>  <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Sockets</a>&amp; can_set = <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#abf8a102c621b1536659973b2d6b33822">m_can</a>[ev_type];</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno">  624</span> </div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno">  625</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Wait result set for event type [&quot;</span> &lt;&lt; ev_type &lt;&lt; <span class="stringliteral">&quot;] emitted in Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno">  626</span>                 <span class="stringliteral">&quot;size [&quot;</span> &lt;&lt; can_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#ad2ce3ff8f57696dcb230f419775ab865">size</a>() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno">  627</span> </div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno">  628</span>  <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a8e16d91f81860eb2a6c971863548e466">ok_to_mod_socket_set</a>(err_code)) <span class="comment">// Ensure we can modify can_set in this state.</span></div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno">  629</span>  {</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno">  630</span>    <span class="comment">// *err_code is set.</span></div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno">  631</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// Closed; do not set *target_set (*want_set is blank anyway).</span></div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno">  632</span>  }</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno">  633</span>  <span class="comment">// else *err_code is success.</span></div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno">  634</span> </div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno">  635</span>  <span class="comment">// Efficiently give them the result set (swap() avoids copy).</span></div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno">  636</span> </div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno">  637</span>  <span class="comment">// This is an O(1) operation.</span></div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno">  638</span>  can_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#a46e27b1b9b75e5dc890af26f85956190">swap</a>(*target_set);</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno">  639</span> </div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno">  640</span>  <span class="comment">/* Get rid of whatever garbage they had in their target set before calling us.</span></div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno">  641</span><span class="comment">   * This is O(n), where n is # of elements in *target_set before the swap.  Typically n == 0. */</span></div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno">  642</span>  can_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#a8844c7594a079eb2d52d78436ed832c6">clear</a>();</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno">  643</span> </div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno">  644</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno">  645</span>} <span class="comment">// Event_set::emit_result_sockets()</span></div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno">  646</span> </div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#afb6379c7fe127c26fd4cdc9752ccf9e2">  647</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#afb6379c7fe127c26fd4cdc9752ccf9e2">Event_set::clear_result_sockets</a>(<a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71">Event_type</a> ev_type, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno">  648</span>{</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno">  649</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#afb6379c7fe127c26fd4cdc9752ccf9e2">clear_result_sockets</a>, ev_type, _1);</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno">  650</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno">  651</span> </div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno">  652</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno">  653</span> </div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno">  654</span>  <span class="comment">// Accessing m_state, the sets, etc. which may be written by other threads at any time.  Must lock.</span></div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno">  655</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno">  656</span> </div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno">  657</span>  <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Sockets</a>&amp; can_set = <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#abf8a102c621b1536659973b2d6b33822">m_can</a>[ev_type];</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno">  658</span> </div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno">  659</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Wait result set for event type [&quot;</span> &lt;&lt; ev_type &lt;&lt; <span class="stringliteral">&quot;] cleared in Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno">  660</span>                 <span class="stringliteral">&quot;size [&quot;</span> &lt;&lt; can_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#ad2ce3ff8f57696dcb230f419775ab865">size</a>() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno">  661</span> </div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno">  662</span>  <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a8e16d91f81860eb2a6c971863548e466">ok_to_mod_socket_set</a>(err_code)) <span class="comment">// Ensure we can modify can_set in this state.</span></div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno">  663</span>  {</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno">  664</span>    <span class="comment">// *err_code is set.</span></div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno">  665</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// Closed; do not clear (it should be cleared anyway).</span></div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno">  666</span>  }</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno">  667</span>  <span class="comment">// else *err_code is success.</span></div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno">  668</span> </div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno">  669</span>  can_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#a8844c7594a079eb2d52d78436ed832c6">clear</a>();</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno">  670</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno">  671</span>}</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno">  672</span> </div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a8e16d91f81860eb2a6c971863548e466">  673</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a8e16d91f81860eb2a6c971863548e466">Event_set::ok_to_mod_socket_set</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)<span class="keyword"> const</span></div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno">  674</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno">  675</span>  <span class="comment">// m_mutex should be locked.</span></div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno">  676</span> </div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno">  677</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">State::S_CLOSED</a>)</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno">  678</span>  {</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno">  679</span>    <span class="comment">// Already CLOSED Event_set -- Node has disowned us.</span></div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno">  680</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae643fd244bd1d6b483295cb9f356b0ae">error::Code::S_EVENT_SET_CLOSED</a>);</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno">  681</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno">  682</span>  }</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno">  683</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno">  684</span> </div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno">  685</span>  <span class="keywordflow">if</span> (<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">State::S_WAITING</a>)</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno">  686</span>  {</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno">  687</span>    <span class="comment">/* Event_set is being waited on; in this phase we do not allow changing events for which to</span></div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno">  688</span><span class="comment">     * wait. We could probably allow it, but the logic involved would become needlessly complex.</span></div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno">  689</span><span class="comment">     * Also, consider a BSD socket select() or a Linux epoll_wait(); once select() or epoll_wait()</span></div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno">  690</span><span class="comment">     * is entered, it&#39;s probably impossible to add events to the set (or at least it&#39;s</span></div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno">  691</span><span class="comment">     * undocumented).  So let&#39;s just not.  Similarly, don&#39;t allow retrieving results untilt he</span></div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno">  692</span><span class="comment">     * wait is finishied. */</span></div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno">  693</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482a3f2c29ade2454001982c033a37fd9c79">error::Code::S_EVENT_SET_IMMUTABLE_WHEN_WAITING</a>);</div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno">  694</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno">  695</span>  }</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno">  696</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno">  697</span>  assert(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">m_state</a> == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">State::S_INACTIVE</a>);</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno">  698</span> </div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno">  699</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno">  700</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno">  701</span>} <span class="comment">// Event_set::ok_to_mod_socket_set()</span></div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno">  702</span> </div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#ab64e128595b701e37256ff79d782c146">  703</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#ab64e128595b701e37256ff79d782c146">Event_set::clear</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno">  704</span>{</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno">  705</span>  <span class="comment">/* Note this can be (and was) written FAR more consiely in terms of other clear_*() methods; but the cost</span></div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno">  706</span><span class="comment">   * was significant: repeated redundant state checks, recursive mutex locks, logging....  The following</span></div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno">  707</span><span class="comment">   * is superior. */</span></div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno">  708</span> </div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno">  709</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<span class="keywordtype">bool</span>, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#ab64e128595b701e37256ff79d782c146">clear</a>, _1);</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno">  710</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno">  711</span> </div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno">  712</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno">  713</span> </div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno">  714</span>  <span class="comment">// Accessing m_state, the sets, etc. which may be written by other threads at any time.  Must lock.</span></div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno">  715</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Lock_guard</a> lock(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">m_mutex</a>);</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno">  716</span> </div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno">  717</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Clearing sets in Event_set [&quot;</span> &lt;&lt; <span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]; pre-clear set sizes: &quot;</span></div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno">  718</span>                 <span class="stringliteral">&quot;wanted [&quot;</span> &lt;&lt; <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a19e241ae4dfe1ea54de6027052bc2135">ev_type_to_socks_map_sizes_to_str</a>(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af4fa5dbda4ffd95b35dee57fc01b90ce">m_want</a>) &lt;&lt; <span class="stringliteral">&quot;], &quot;</span></div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno">  719</span>                 <span class="stringliteral">&quot;results [&quot;</span> &lt;&lt; <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a19e241ae4dfe1ea54de6027052bc2135">ev_type_to_socks_map_sizes_to_str</a>(<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#abf8a102c621b1536659973b2d6b33822">m_can</a>) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno">  720</span> </div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno">  721</span>  <span class="keywordflow">if</span> (!<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a8e16d91f81860eb2a6c971863548e466">ok_to_mod_socket_set</a>(err_code)) <span class="comment">// Ensure we can modify *want_set in this state.</span></div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno">  722</span>  {</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno">  723</span>    <span class="comment">// *err_code is set.</span></div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno">  724</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno">  725</span>  }</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno">  726</span>  <span class="comment">// else *err_code is success.</span></div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno">  727</span> </div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno">  728</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">clear_ev_type_to_socks_map</a>(&amp;<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#abf8a102c621b1536659973b2d6b33822">m_can</a>);</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno">  729</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">clear_ev_type_to_socks_map</a>(&amp;<a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#af4fa5dbda4ffd95b35dee57fc01b90ce">m_want</a>);</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno">  730</span> </div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno">  731</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno">  732</span>}</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno">  733</span> </div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a79d75ea514f571d9f6bd2cfcad502f22">  734</a></span><a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__map.html">Event_set::Ev_type_to_socks_map</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a79d75ea514f571d9f6bd2cfcad502f22">Event_set::empty_ev_type_to_socks_map</a>() <span class="comment">// Static.</span></div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno">  735</span>{</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno">  736</span>  <span class="keywordflow">return</span> <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#affac46b4e327b3781faab4853a290877">Ev_type_to_socks_map</a></div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno">  737</span>         ({</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno">  738</span>            <span class="comment">// Linked_hash_map order is significant.  Iteration will occur in this canonical order in logs, etc.</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno">  739</span>            { <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71a7cedcbdde2b86daeb1268c63c6cb6b88">Event_type::S_PEER_SOCKET_READABLE</a>, <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a592b3ce6602051bd9994216041a3cbdc">Sockets</a>() },</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno">  740</span>            { <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71a5efb94617bcb00507a087224ce7a7d02">Event_type::S_PEER_SOCKET_WRITABLE</a>, <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a592b3ce6602051bd9994216041a3cbdc">Sockets</a>() },</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno">  741</span>            { <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71afb218b0110d3f9f26ee089bad2e0eba2">Event_type::S_SERVER_SOCKET_ACCEPTABLE</a>, <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a592b3ce6602051bd9994216041a3cbdc">Sockets</a>() }</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno">  742</span>          });</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno">  743</span>}</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno">  744</span> </div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">  745</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">Event_set::clear_ev_type_to_socks_map</a>(<a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__map.html">Ev_type_to_socks_map</a>* ev_type_to_socks_map) <span class="comment">// Static.</span></div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno">  746</span>{</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno">  747</span>  assert(ev_type_to_socks_map);</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno">  748</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; ev_type_and_socks : *ev_type_to_socks_map)</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno">  749</span>  {</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno">  750</span>    ev_type_and_socks.second.clear();</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno">  751</span>  }</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno">  752</span>}</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno">  753</span> </div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#aed9505b886c78169fe35b527f4e01855">  754</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#aed9505b886c78169fe35b527f4e01855">Event_set::ev_type_to_socks_map_entry_is_empty</a>(<span class="keyword">const</span> Ev_type_to_socks_map::Value&amp; ev_type_and_socks) <span class="comment">// Static.</span></div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno">  755</span>{</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno">  756</span>  <span class="keywordflow">return</span> ev_type_and_socks.second.empty();</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno">  757</span>}</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno">  758</span> </div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#a19e241ae4dfe1ea54de6027052bc2135">  759</a></span>std::string <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a19e241ae4dfe1ea54de6027052bc2135">Event_set::ev_type_to_socks_map_sizes_to_str</a>(<span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__map.html">Ev_type_to_socks_map</a>&amp; ev_type_to_socks_map)</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno">  760</span>{</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno">  761</span>  <span class="keyword">using </span>std::string;</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno">  762</span>  <span class="keywordtype">string</span> out;</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno">  763</span> </div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno">  764</span>  <span class="keywordtype">size_t</span> n_left = ev_type_to_socks_map.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__map.html#aba0949de5032e8dd6d75a48bcac9b060">size</a>();</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno">  765</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; ev_type_and_socks : ev_type_to_socks_map)</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno">  766</span>  {</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno">  767</span>    <a class="code hl_function" href="namespaceflow_1_1util.html#a8afd30c50bcd670d45442df49d1da484">util::ostream_op_to_string</a>(&amp;out,</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno">  768</span>                               ev_type_and_socks.first, <span class="stringliteral">&quot;: &quot;</span>, ev_type_and_socks.second.size(),</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno">  769</span>                               (((--n_left) == 0) ? <span class="stringliteral">&quot;&quot;</span> : <span class="stringliteral">&quot;, &quot;</span>));</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno">  770</span>  }</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno">  771</span> </div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno">  772</span>  <span class="keywordflow">return</span> out;</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno">  773</span>}</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno">  774</span> </div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#ae04c117b15179ba37a94f6836c63497b">  775</a></span>std::string <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#ae04c117b15179ba37a94f6836c63497b">Event_set::sock_as_any_to_str</a>(<span class="keyword">const</span> boost::any&amp; sock_as_any) <span class="comment">// Static.</span></div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno">  776</span>{</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno">  777</span>  <span class="keyword">using </span>boost::any_cast;</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno">  778</span>  <span class="keyword">using </span>std::string;</div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno">  779</span> </div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno">  780</span>  <span class="keywordtype">string</span> out;</div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno">  781</span> </div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno">  782</span>  <span class="comment">/* A boost::any can contain an object of almost any type or be empty.  Our boost:any&#39;s can only be those</span></div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno">  783</span><span class="comment">   * from what we load into Sockets sets; currently the following types.  So just find the correct type</span></div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno">  784</span><span class="comment">   * and then cast to it. */</span></div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno">  785</span>  <span class="keyword">const</span> <span class="keyword">auto</span>&amp; type_id = sock_as_any.type();</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno">  786</span>  <span class="keywordflow">if</span> (type_id == <span class="keyword">typeid</span>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>))</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno">  787</span>  {</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno">  788</span>    <a class="code hl_function" href="namespaceflow_1_1util.html#a8afd30c50bcd670d45442df49d1da484">util::ostream_op_to_string</a>(&amp;out, any_cast&lt;Peer_socket::Ptr&gt;(sock_as_any));</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno">  789</span>  }</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno">  790</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type_id == <span class="keyword">typeid</span>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a>))</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno">  791</span>  {</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno">  792</span>    <a class="code hl_function" href="namespaceflow_1_1util.html#a8afd30c50bcd670d45442df49d1da484">util::ostream_op_to_string</a>(&amp;out, any_cast&lt;Server_socket::Ptr&gt;(sock_as_any));</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno">  793</span>  }</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno">  794</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno">  795</span>  {</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno">  796</span>    assert(sock_as_any.empty());</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno">  797</span>    out = <span class="stringliteral">&quot;none&quot;</span>;</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno">  798</span>  }</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno">  799</span> </div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno">  800</span>  <span class="keywordflow">return</span> out;</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno">  801</span>}</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno">  802</span> </div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno">  803</span><span class="comment">// Event_set::Socket_as_any* implementations.</span></div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno">  804</span> </div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno">  805</span><span class="comment">// Method implementations.</span></div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno">  806</span> </div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set_1_1Socket__as__any__hash.html#acdda0f516ad0c1e562ff1797cea653cc">  807</a></span><span class="keywordtype">size_t</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set_1_1Socket__as__any__hash.html#acdda0f516ad0c1e562ff1797cea653cc">Event_set::Socket_as_any_hash::operator()</a>(<span class="keyword">const</span> boost::any&amp; sock_as_any)<span class="keyword"> const</span></div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno">  808</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno">  809</span>  <span class="keyword">using </span>boost::any_cast;</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno">  810</span>  <span class="keyword">using </span>boost::hash;</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno">  811</span> </div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno">  812</span>  <span class="comment">/* A boost::any can contain an object of almost any type or be empty.  Our boost:any&#39;s can only be those</span></div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno">  813</span><span class="comment">   * from what we load into Sockets sets; currently the following types.  So just find the correct type</span></div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno">  814</span><span class="comment">   * and then cast to it.  Then just apply the default hash operation to that, as would be done if we</span></div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno">  815</span><span class="comment">   * were simply storing a set or map with keys of that type.</span></div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno">  816</span><span class="comment">   *</span></div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno">  817</span><span class="comment">   * Collisions are allowed anyway -- though best avoided for hash lookup performance -- but in this case</span></div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno">  818</span><span class="comment">   * hash&lt;&gt; will just use the pointer&#39;s raw value anyway, and in practice that should ensure completely</span></div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno">  819</span><span class="comment">   * disjoins sets of hash values for each of the possible stored types. */</span></div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno">  820</span>  <span class="keyword">const</span> <span class="keyword">auto</span>&amp; type_id = sock_as_any.type();</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno">  821</span>  <span class="keywordflow">if</span> (type_id == <span class="keyword">typeid</span>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>))</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno">  822</span>  {</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno">  823</span>    <span class="keywordflow">return</span> hash&lt;Peer_socket::Ptr&gt;()(any_cast&lt;Peer_socket::Ptr&gt;(sock_as_any));</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno">  824</span>  }</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno">  825</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno">  826</span>  <span class="keywordflow">if</span> (type_id == <span class="keyword">typeid</span>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a>))</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno">  827</span>  {</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno">  828</span>    <span class="keywordflow">return</span> hash&lt;Server_socket::Ptr&gt;()(any_cast&lt;Server_socket::Ptr&gt;(sock_as_any));</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno">  829</span>  }</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno">  830</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno">  831</span> </div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno">  832</span>  assert(sock_as_any.empty());</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno">  833</span>  <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno">  834</span>}</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno">  835</span> </div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set_1_1Socket__as__any__equals.html#a2651cf79dd65bdc60707ff3a368f5d9a">  836</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set_1_1Socket__as__any__equals.html#a2651cf79dd65bdc60707ff3a368f5d9a">Event_set::Socket_as_any_equals::operator()</a>(<span class="keyword">const</span> boost::any&amp; sock_as_any1,</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno">  837</span>                                                 <span class="keyword">const</span> boost::any&amp; sock_as_any2)<span class="keyword"> const</span></div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno">  838</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno">  839</span>  <span class="keyword">using </span>boost::any_cast;</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno">  840</span> </div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno">  841</span>  <span class="comment">/* A boost::any can contain an object of almost any type or be empty.  Our boost:any&#39;s can only be those</span></div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno">  842</span><span class="comment">   * from what we load into Sockets sets; currently the following types.  Firstly, if the two anys&#39; types</span></div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno">  843</span><span class="comment">   * are different, they are obviously different objects.  (Note, also, that in practice we&#39;ll be storing</span></div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno">  844</span><span class="comment">   * only objects of the same type in each Sockets structure; thus that case should rarely, if ever,</span></div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno">  845</span><span class="comment">   * come into play.)</span></div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno">  846</span><span class="comment">   *</span></div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno">  847</span><span class="comment">   * Assuming they are of the same type, just find the correct type and then cast both to it.  Now that type&#39;s</span></div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno">  848</span><span class="comment">   * operator==() can do the job, as it would if we were simply storing a set or map with keys of that type. */</span></div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno">  849</span> </div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno">  850</span>  <span class="keywordflow">if</span> (sock_as_any1.type() != sock_as_any2.type())</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno">  851</span>  {</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno">  852</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno">  853</span>  }</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno">  854</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno">  855</span> </div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno">  856</span>  <span class="keyword">const</span> <span class="keyword">auto</span>&amp; type_id = sock_as_any1.type();</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno">  857</span> </div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno">  858</span>  <span class="keywordflow">if</span> (type_id == <span class="keyword">typeid</span>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Peer_socket::Ptr</a>))</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno">  859</span>  {</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno">  860</span>    <span class="keywordflow">return</span> any_cast&lt;Peer_socket::Ptr&gt;(sock_as_any1) == any_cast&lt;Peer_socket::Ptr&gt;(sock_as_any2);</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno">  861</span>  }</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno">  862</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno">  863</span>  <span class="keywordflow">if</span> (type_id == <span class="keyword">typeid</span>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Server_socket::Ptr</a>))</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno">  864</span>  {</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno">  865</span>    <span class="keywordflow">return</span> any_cast&lt;Server_socket::Ptr&gt;(sock_as_any1) == any_cast&lt;Server_socket::Ptr&gt;(sock_as_any2);</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno">  866</span>  }</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno">  867</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno">  868</span> </div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno">  869</span>  assert(sock_as_any1.empty()); <span class="comment">// Note: type_id == typeid(void), in this case.</span></div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno">  870</span>  assert(sock_as_any2.empty());</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno">  871</span> </div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno">  872</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno">  873</span>}</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno">  874</span> </div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno">  875</span><span class="comment">// Node implementations (dealing with individual Event_sets but also Node state).</span></div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno">  876</span> </div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno">  877</span><span class="comment">// Method implementations.</span></div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno">  878</span> </div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#ad100464cf0126dbbad39bde1c90a774f">  879</a></span><a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ad100464cf0126dbbad39bde1c90a774f">Node::event_set_create</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno">  880</span>{</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno">  881</span>  <a class="code hl_define" href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a>, event_set_create, _1);</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno">  882</span>  <span class="comment">// ^-- Call ourselves and return if err_code is null.  If got to present line, err_code is not null.</span></div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno">  883</span> </div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno">  884</span>  <span class="keyword">using </span><a class="code hl_function" href="namespaceflow_1_1async.html#a24567271e97a67d3cae6bd8bf8dc63c4">async::asio_exec_ctx_post</a>;</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno">  885</span>  <span class="keyword">using </span><a class="code hl_enumeration" href="namespaceflow_1_1async.html#a0a06794b16b72f2829ce3353557c8485">async::Synchronicity</a>;</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno">  886</span> </div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno">  887</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno">  888</span> </div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno">  889</span>  <span class="keywordflow">if</span> (!running())</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno">  890</span>  {</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno">  891</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482affac5d80b4e72f2e55bbbfadce2efd2e">error::Code::S_NODE_NOT_RUNNING</a>);</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno">  892</span>    <span class="keywordflow">return</span> <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a>();</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno">  893</span>  }</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno">  894</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno">  895</span> </div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno">  896</span>  <span class="comment">/* Put the rest of the work into thread W.  For justification, see big comment in listen().</span></div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno">  897</span><span class="comment">   * Addendum regarding performance: event_set_create() should be pretty rare. */</span></div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno">  898</span> </div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno">  899</span>  <span class="comment">// Load this body onto thread W boost.asio work queue.  event_set_promise captured by reference, as we will wait.</span></div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno">  900</span>  <a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a> event_set(<span class="keyword">new</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a7b8e6cf7046b6905015301a203cd88f5">Event_set</a>(<a class="code hl_function" href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">get_logger</a>()));</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno">  901</span>  event_set-&gt;m_state = <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">Event_set::State::S_INACTIVE</a>;</div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno">  902</span>  event_set-&gt;m_node = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno">  903</span>  event_set-&gt;m_baseline_check_pending = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno">  904</span>  <a class="code hl_function" href="namespaceflow_1_1async.html#a24567271e97a67d3cae6bd8bf8dc63c4">asio_exec_ctx_post</a>(<a class="code hl_function" href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">get_logger</a>(), &amp;m_task_engine, Synchronicity::S_ASYNC_AND_AWAIT_CONCURRENT_COMPLETION, [&amp;]()</div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno">  905</span>  {</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno">  906</span>    <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno">  907</span>    m_event_sets.insert(event_set);</div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno">  908</span>  });</div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno">  909</span>  <span class="comment">// If got here, the task has completed in thread W and signaled us to that effect.</span></div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno">  910</span> </div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno">  911</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno">  912</span>  <span class="keywordflow">return</span> event_set;</div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno">  913</span>} <span class="comment">// Node::event_set_create()</span></div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno">  914</span> </div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#aa18a14a4749f34d07c71bb2a1214d65f">  915</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#aa18a14a4749f34d07c71bb2a1214d65f">Node::event_set_async_wait</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a> event_set, <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1Function.html">Event_set::Event_handler</a>&amp; on_event,</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno">  916</span>                                <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno">  917</span>{</div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno">  918</span>  <span class="keyword">using </span>boost::asio::post;</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno">  919</span>  <span class="keyword">using </span>boost::any;</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno">  920</span> </div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno">  921</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno">  922</span> </div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno">  923</span>  <span class="keywordflow">if</span> (!running())</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno">  924</span>  {</div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno">  925</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482affac5d80b4e72f2e55bbbfadce2efd2e">error::Code::S_NODE_NOT_RUNNING</a>);</div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno">  926</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno">  927</span>  }</div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno">  928</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno">  929</span> </div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno">  930</span>  <span class="comment">// See giant comment in Event_set::async_wait(), which just called us, before proceeding.</span></div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno">  931</span> </div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno">  932</span>  <span class="comment">// event_set is locked (and will be unlocked after we exit).</span></div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno">  933</span> </div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno">  934</span>  <span class="comment">// Check explicitly documented pre-condition.</span></div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno">  935</span>  assert(event_set-&gt;m_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">Event_set::State::S_INACTIVE</a>);</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno">  936</span> </div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno">  937</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; event_set &lt;&lt; <span class="stringliteral">&quot;] wait requested; moving from &quot;</span></div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno">  938</span>                 <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">Event_set::State::S_INACTIVE</a> &lt;&lt; <span class="stringliteral">&quot;] to [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a> &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno">  939</span> </div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno">  940</span>  <span class="comment">// Cock the gun....</span></div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno">  941</span>  event_set-&gt;m_state = <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a>;</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno">  942</span>  event_set-&gt;m_on_event = on_event;</div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno">  943</span> </div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno">  944</span>  <span class="comment">// Clear result sets, so when we get back to S_INACTIVE (events fire), only the events that happened are there.</span></div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno">  945</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">Event_set::clear_ev_type_to_socks_map</a>(&amp;event_set-&gt;m_can);</div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno">  946</span> </div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno">  947</span>  <span class="comment">/* As described in Event_set::async_wait() giant comment, thread W must check all events (sockets</span></div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno">  948</span><span class="comment">   * + desired states) of interest (in event_set-&gt;m_want) as soon as possible, in case those</span></div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno">  949</span><span class="comment">   * conditions already hold.  If any hold, it should fire m_on_event() right then.  For example,</span></div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno">  950</span><span class="comment">   * Peer_socket P in m_want[S_PEER_SOCKET_READABLE] may already be Readable, so this would be immediately detected;</span></div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno">  951</span><span class="comment">   * if we don&#39;t do that, the Readable status would only be detected later (if ever) if, say, more</span></div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno">  952</span><span class="comment">   * DATA packets arrive. */</span></div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno">  953</span> </div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno">  954</span>  post(m_task_engine, [<span class="keyword">this</span>, event_set]() { event_set_check_baseline_assuming_state(event_set); });</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno">  955</span> </div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno">  956</span>  <span class="comment">/* Thread W will invoke this-&gt;event_set_check_baseline_assuming_state(event_set) the next time it</span></div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno">  957</span><span class="comment">   * gets a free moment.  (Might be right NOW, though it won&#39;t be able to lock and will wait until</span></div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno">  958</span><span class="comment">   * we unlock just below.) */</span></div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno">  959</span> </div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno">  960</span>  <span class="comment">/* Corner case: Let P be in m_want[PEER_SOCKET_READABLE].  Assume thread W is executing a handler right now which</span></div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno">  961</span><span class="comment">   * gets a DATA packet on socket P.  Having saved it into P&#39;s Receive buffer, it will check each</span></div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno">  962</span><span class="comment">   * Event_set in *this Node.  We will unlock shortly, at which point W will note that event_set is</span></div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno">  963</span><span class="comment">   * S_WAITING, and P is in m_want[P_S_R].  Therefore it will fire event_set-&gt;m_on_event() and make</span></div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno">  964</span><span class="comment">   * event_set S_INACTIVE again.  This will happen before event_set_check_baseline() runs.  When</span></div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno">  965</span><span class="comment">   * that runs, it will be in INACTIVE state again and thus not do anything.</span></div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno">  966</span><span class="comment">   *</span></div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno">  967</span><span class="comment">   * Is this bad?  Not really.  It just so happens that that sole socket P wins the race and</span></div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno">  968</span><span class="comment">   * triggers m_on_event().  This doesn&#39;t violate the goal: to report the moment 1 or more events</span></div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno">  969</span><span class="comment">   * hold; 1 is indeed &quot;1 or more.&quot;  However, let&#39;s try to avoid situation anyway (be &quot;greedy&quot; for</span></div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno">  970</span><span class="comment">   * more ready events at a time).  Set event_set-&gt;m_baseline_check_pending = true.  This will be a</span></div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno">  971</span><span class="comment">   * sign to thread W that, when it next examines event_set for a &quot;delta&quot; check (such as upon</span></div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno">  972</span><span class="comment">   * receiving the DATA packet in this example), it should instead perform the full baseline check</span></div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno">  973</span><span class="comment">   * of all events.  Then the queued up event_set_check_baseline() can do nothing if that bool is</span></div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno">  974</span><span class="comment">   * false by then; or do the work and set it to false if it wins the race and performs the full check,</span></div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno">  975</span><span class="comment">   * in which case the aforementioned &quot;delta&quot; check would just do the &quot;delta&quot; check after all. */</span></div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno">  976</span>  event_set-&gt;m_baseline_check_pending = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno">  977</span> </div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno">  978</span>  <span class="comment">/* That&#39;s it.  event_set_check_baseline() will execute soon.  If it detects no events, thread W</span></div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno">  979</span><span class="comment">   * will keep checking for relevant events as states become Readable/Writable/Acceptable/etc. on various</span></div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno">  980</span><span class="comment">   * sockets.  Eventually it will fire and change m_state from S_WAITING to S_INACTIVE. */</span></div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno">  981</span> </div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno">  982</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno">  983</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno">  984</span>  <span class="comment">// Unlock happens right after this returns.</span></div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno">  985</span>} <span class="comment">// Node::event_set_async_wait()</span></div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno">  986</span> </div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a4a21e69d3ae442b2cc06220514de364a">  987</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a4a21e69d3ae442b2cc06220514de364a">Node::event_set_check_baseline_assuming_state</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a> event_set)</div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno">  988</span>{</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno">  989</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno">  990</span> </div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno">  991</span>  <span class="comment">// Imperative to lock all of event_set.  Much access possible from user threads.</span></div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno">  992</span>  <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Event_set::Lock_guard</a> lock(event_set-&gt;m_mutex);</div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno">  993</span> </div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno">  994</span>  <span class="comment">/* event_set_async_wait() placed us onto thread W.  When it did so, event_set-&gt;m_state ==</span></div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno">  995</span><span class="comment">   * S_WAITING (waiting for 1+ events to hold, so we can inform user).  However that may have</span></div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno">  996</span><span class="comment">   * changed by the time boost.asio was able to get to us.  E.g., socket was closed due to error, or</span></div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno">  997</span><span class="comment">   * an event was detected before we executed, so we&#39;re S_INACTIVE again.  So check for that. */</span></div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno">  998</span> </div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno">  999</span>  <span class="keywordflow">if</span> (event_set-&gt;m_state != <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a>)</div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span>  {</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span>    <span class="comment">// Unlikely but legitimate and kind of interesting.</span></div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span>    <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; event_set &lt;&lt; <span class="stringliteral">&quot;] baseline check ran, but state is no &quot;</span></div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span>                   <span class="stringliteral">&quot;longer [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a> &lt;&lt; <span class="stringliteral">&quot;] but [&quot;</span> &lt;&lt; event_set-&gt;m_state &lt;&lt; <span class="stringliteral">&quot;] instead.&quot;</span>);</div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span>  }</div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span>  <span class="comment">// else state is WAITING: should actually perform the baseline check.</span></div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span> </div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span>  <span class="keywordflow">if</span> (event_set_check_baseline(event_set)) <span class="comment">// Assumes m_mutex is already locked.</span></div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span>  {</div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span>    <span class="comment">// Some fired events may now be recorded inside event_set.  Inform user and go to INACTIVE again if so.</span></div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span>    event_set_fire_if_got_events(event_set); <span class="comment">// This method assumes m_mutex is already locked.</span></div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span>  }</div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span>} <span class="comment">// Node::event_set_check_baseline_assuming_state()</span></div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span> </div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a2195fb7d86acfaf340b3e7e59e7e10e8"> 1015</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a2195fb7d86acfaf340b3e7e59e7e10e8">Node::event_set_check_baseline</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a> event_set)</div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span>{</div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span>  <span class="keyword">using </span>boost::any;</div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span>  <span class="keyword">using </span>boost::any_cast;</div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span> </div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span>  <span class="comment">// We are in thread W *or* thread U != W.  CAUTION!!!  Ensure all operations below can be done from thread U!</span></div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span> </div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span>  <span class="comment">// event_set is already locked (pre-condition).</span></div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span> </div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span>  <span class="comment">// Check explicitly documented pre-condition.</span></div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span>  assert(event_set-&gt;m_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a>);</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span> </div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span>  <span class="comment">/* Our mission is to simply run through every condition in the event_set-&gt;m_want sets and</span></div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span><span class="comment">   * check whether it holds.  For each one that does, save it in the appropriate event_set-&gt;m_got</span></div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span><span class="comment">   * set.  Then if any did apply, run event_set-&gt;m_on_event() to inform the user, and go back to</span></div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span><span class="comment">   * INACTIVE state.  The background for this is in Event_set::async_wait() and friends.</span></div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span><span class="comment">   *</span></div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span><span class="comment">   * This is a more thorough (and slow) check than that invoked when a condition of interest</span></div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span><span class="comment">   * (e.g., new DATA packet added to Receive buffer) arises. */</span></div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span> </div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span>  <span class="keywordflow">if</span> (!event_set-&gt;m_baseline_check_pending)</div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span>  {</div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span>    <span class="comment">/* Check already performed once since event_set became WAITING.  Therefore all subsequent checks</span></div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span><span class="comment">     * are the faster &quot;delta&quot; checks, invoked when individual conditions of interest become true. */</span></div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span>    <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; event_set &lt;&lt; <span class="stringliteral">&quot;] baseline check ran, but skipping because same check already &quot;</span></div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span>                   <span class="stringliteral">&quot;ran since the last time we entered [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a> &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span>  }</div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span>  <span class="comment">// else if (!event_set-&gt;m_baseline_check_pending)</span></div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> </div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; event_set &lt;&lt; <span class="stringliteral">&quot;] baseline check started.&quot;</span>);</div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span>  event_set-&gt;m_baseline_check_pending = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span> </div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span>  <span class="comment">/* For each type of event, run through each event we want to know about if it&#39;s true, and if</span></div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span><span class="comment">   * it&#39;s true, add it to the active events list for that event type. */</span></div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span> </div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span>  <span class="keyword">static_assert</span>(<a class="code hl_class" href="classflow_1_1util_1_1Container__traits.html">util::Container_traits&lt;Event_set::Sockets&gt;::S_CONSTANT_TIME_INSERT</a>,</div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span>                <span class="stringliteral">&quot;Expecting amortized constant time insertion sockets container.&quot;</span>); <span class="comment">// Ensure fastness.</span></div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span> </div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span>  <span class="comment">/* To get the set of Event_type, use S_EV_TYPE_TO_IS_ACTIVE_NODE_MTD which has them as the key set;</span></div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span><span class="comment">   * it also stores the functions of the form `bool Node::does_event_hold(const any&amp; sock_as_any)`, where</span></div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span><span class="comment">   * sock_as_any is a boost::any wrapping a socket appropriate to the given Event_type, and the function will</span></div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span><span class="comment">   * return whether the condition of that type holds for a given socket of interest. */</span></div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; ev_type_and_is_active_mtd : <a class="code hl_variable" href="classflow_1_1net__flow_1_1Event__set.html#aa321c69146b8575e4d0e3b15c67d4f08">Event_set::S_EV_TYPE_TO_IS_ACTIVE_NODE_MTD</a>)</div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span>  {</div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span>    <span class="keyword">const</span> <a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71">Event_set::Event_type</a> ev_type = ev_type_and_is_active_mtd.first;</div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span>    <span class="keyword">const</span> <span class="keyword">auto</span>&amp; does_event_hold = ev_type_and_is_active_mtd.second;</div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span>    <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Event_set::Sockets</a>&amp; want_set = event_set-&gt;m_want[ev_type];</div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span>    <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Event_set::Sockets</a>&amp; can_set = event_set-&gt;m_can[ev_type];</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> </div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span>    assert(can_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#a048a8d78c4ae3bc45c8bcede6b0e2dc6">empty</a>()); <span class="comment">// We will now fill it up.</span></div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span>    <span class="keywordflow">for</span> (<span class="keyword">const</span> any&amp; sock_as_any : want_set)</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span>    {</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span>      <span class="keywordflow">if</span> (does_event_hold(<span class="keyword">this</span>, sock_as_any))</div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span>      {</div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span>        <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event of type [&quot;</span> &lt;&lt; ev_type &lt;&lt; <span class="stringliteral">&quot;] for &quot;</span></div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span>                       <span class="stringliteral">&quot;object [&quot;</span> &lt;&lt; <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#ae04c117b15179ba37a94f6836c63497b">Event_set::sock_as_any_to_str</a>(sock_as_any) &lt;&lt; <span class="stringliteral">&quot;] detected in &quot;</span></div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span>                       <span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; event_set &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> </div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span>        can_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#a517b9b0ac9d6ab2c56e27ba380f87180">insert</a>(sock_as_any);</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span>      }</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span>    }</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span>  }</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> </div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>; <span class="comment">// This only means the check ran, not that it found anything.</span></div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span>} <span class="comment">// Node::event_set_check_baseline()</span></div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> </div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#afdefbbb3c3b9f2f2866f6b4c770fa62d"> 1082</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#afdefbbb3c3b9f2f2866f6b4c770fa62d">Node::event_set_fire_if_got_events</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a> event_set)</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span>{</div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span>  <span class="keyword">using </span>boost::algorithm::all_of;</div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> </div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> </div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span>  <span class="comment">// event_set state involved should already be locked.</span></div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> </div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span>  <span class="comment">// Explicitly documented pre-condition.</span></div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span>  assert(event_set-&gt;m_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a>);</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> </div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span>  <span class="keywordflow">if</span> (all_of(event_set-&gt;m_can, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#aed9505b886c78169fe35b527f4e01855">Event_set::ev_type_to_socks_map_entry_is_empty</a>))</div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span>  {</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span>    <span class="comment">// Nope, no events ready.  Carry on in WAITING state.</span></div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span>  }</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> </div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span>  <span class="comment">// If editing this, check interrupt_all_waits_worker() also. That&#39;s another path to firing m_on_event().</span></div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> </div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span>  <span class="comment">// Yes!  At least one event is ready, so inform via the m_on_event() callback.</span></div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; event_set &lt;&lt; <span class="stringliteral">&quot;] has ready events; firing and moving from &quot;</span></div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span>                 <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a> &lt;&lt; <span class="stringliteral">&quot;] to [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">Event_set::State::S_INACTIVE</a> &lt;&lt; <span class="stringliteral">&quot;] again.&quot;</span>);</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> </div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span>  event_set-&gt;m_on_event(<span class="keyword">false</span>);</div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> </div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span>  <span class="comment">// Forget the callback.  They set the callback each time async_wait() is called (as an argument to that method).</span></div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span>  event_set-&gt;m_on_event.clear();</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> </div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span>  <span class="comment">// Gun has fired and is thus no longer cocked.</span></div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span>  event_set-&gt;m_state = <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">Event_set::State::S_INACTIVE</a>;</div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span> </div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span>  <span class="comment">/* It&#39;s important to understand what happens now.  m_on_event() just did whatever the user wants</span></div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span><span class="comment">   * (presumably signal the user thread(s) (not W) that event_set is back to INACTIVE state and</span></div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span><span class="comment">   * currently holds the active events in event_set-&gt;m_can).  For example it might set a future</span></div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span><span class="comment">   * that the user thread is waiting on; or it might send a Unix domain socket message or local TCP</span></div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span><span class="comment">   * message, which the user thread is select()ing on and thus wake it up.  The point is, the user</span></div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span><span class="comment">   * thread U may already be awake RIGHT NOW and trying to check event_set-&gt;m_can for activity.</span></div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span><span class="comment">   *</span></div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span><span class="comment">   * However, we have not unlocked event_set yet.  We soon will; until then U will sit there waiting</span></div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span><span class="comment">   * for the unlock (any access to event_set must lock event_set mutex; this is enforced by all</span></div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span><span class="comment">   * public Event_set methods).  Once acquired, it can freely check it and perform actions like</span></div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span><span class="comment">   * receive() or accept(). */</span></div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span>} <span class="comment">// Node::event_set_fire_if_got_events()</span></div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> </div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a8a4ddf81ddbeab1f740940c4cc0d3625"> 1127</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a8a4ddf81ddbeab1f740940c4cc0d3625">Node::event_set_all_check_delta</a>(<span class="keywordtype">bool</span> defer_delta_check)</div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span>{</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> </div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span>  <span class="keyword">using </span>boost::any;</div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span>  <span class="keyword">using </span>boost::algorithm::all_of;</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> </div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span>  <span class="comment">/* Short-circuit (avoid logging, unneeded locking, etc.) if no delta events have been noted so</span></div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span><span class="comment">   * far.  (If baseline check has not run yet, it is queued by boost.asio as</span></div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span><span class="comment">   * event_set_check_baseline_assuming_state(), so we need not worry about it here.) */</span></div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span>  <span class="keywordflow">if</span> (all_of(m_sock_events, <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#aed9505b886c78169fe35b527f4e01855">Event_set::ev_type_to_socks_map_entry_is_empty</a>))</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span>  {</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span>  }</div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> </div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Possible event of interest occurred; &quot;</span></div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span>                 <span class="stringliteral">&quot;defer_delta_check = [&quot;</span> &lt;&lt; defer_delta_check &lt;&lt; <span class="stringliteral">&quot;]; &quot;</span></div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span>                 <span class="stringliteral">&quot;results set sizes = [&quot;</span> &lt;&lt; <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a19e241ae4dfe1ea54de6027052bc2135">Event_set::ev_type_to_socks_map_sizes_to_str</a>(m_sock_events) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span> </div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span>  <span class="keywordflow">if</span> (defer_delta_check)</div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span>  {</div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span>    <span class="comment">/* Caller believes there&#39;s an event_set_all_check_delta(false) call within a &quot;non-blocking&quot;</span></div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span><span class="comment">     * amount of time, so we should let more possible events accumulate before possibly signaling</span></div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span><span class="comment">     * user.  Okay. */</span></div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span>  }</div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> </div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span>  <span class="comment">/* Delta-check not deferred.  We should perform it... but there&#39;s a possibility that we haven&#39;t</span></div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span><span class="comment">   * performed the baseline check yet.  As explained in giant comment inside</span></div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span><span class="comment">   * Event_set::async_wait(), a delta check must be performed after a baseline check (and assuming</span></div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span><span class="comment">   * the latter fired no events); otherwise its results would be incomplete.  How we can get to a delta check</span></div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span><span class="comment">   * before a baseline check is explained in the comment in Node::event_set_async_wait().</span></div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span><span class="comment">   *</span></div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span><span class="comment">   * So, if we haven&#39;t, perform the baseline check first.  Basically it is an exhaustive check of</span></div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span><span class="comment">   * all desired events, regardless of what&#39;s in the delta-check variables Node::m_sock_events.  See that</span></div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span><span class="comment">   * below.  For purposes of discussion, though, assume we do indeed perform only delta checks.</span></div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span><span class="comment">   * Then:</span></div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span><span class="comment">   *</span></div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span><span class="comment">   * Now we check all WAITING Event_sets.  For each one, find any waited-on conditions that have</span></div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span><span class="comment">   * indeed occurred since the last time we did this; these are accumulated in this-&gt;m_sock_events.  Any</span></div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span><span class="comment">   * that did indicate that at least one event of interest has occurred, and thus we should mark all</span></div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span><span class="comment">   * of them down in the appropriate Event_set(s) and signal those waiting on these Event_sets.</span></div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span><span class="comment">   *</span></div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span><span class="comment">   * Note that we check ALL registered Event_sets.  This seems a little crude/inefficient.  How to</span></div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span><span class="comment">   * avoid it?  Basically we&#39;d need to map each (Peer/Server_socket, event type) pair to any</span></div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span><span class="comment">   * containing, waiting Event_set(s), so that we can quickly go from the pair to the Event_set.</span></div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span><span class="comment">   * The problem is synchronization (since sockets are added to Event_sets, and</span></div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span><span class="comment">   * Event_set::async_wait() is called, by user threads, not W).  I thought about this pretty hard</span></div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span><span class="comment">   * and was unable to come up with anything elegant that would avoid possible deadlocks w/r/t each</span></div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span><span class="comment">   * Event_set&#39;s individual m_mutex as well.  I thought and thought and thought and eventually</span></div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span><span class="comment">   * realized that simply iterating over all Event_sets and handling one at a time sidesteps all</span></div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span><span class="comment">   * such complexities.  Is this slow?  Firstly there&#39;s the iteration over all Event_sets.  How many</span></div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span><span class="comment">   * are there?  Realistically, there&#39;s probably one per user thread, of which there would be about</span></div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span><span class="comment">   * as many as CPU cores.  That is not a lot.  So take one Event_set.  For each active socket in</span></div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span><span class="comment">   * this-&gt;m_sock_events[...], we just look it up in the Event_set&#39;s appropriate m_want[...]; since we store the</span></div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span><span class="comment">   * latter in a hash table, that&#39;s a constant time search.  If we did have the socket-to-Event_set</span></div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span><span class="comment">   * map (and figured out a working synchronization scheme), that would also be just one</span></div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span><span class="comment">   * constant-time search.  So without the nice mapping being available, the performance is only</span></div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span><span class="comment">   * slowed down by having to look at each Event_set, and there are not many in practice, and an</span></div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span><span class="comment">   * extra constant-time lookup beyond that.  So it&#39;s fine. */</span></div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span> </div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span>  <span class="keywordflow">for</span> (<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a> event_set : m_event_sets)</div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span>  {</div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span>    <span class="comment">// As explained above, work on one Event_set at a time.  Lock it.</span></div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span>    <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Event_set::Lock_guard</a> lock(event_set-&gt;m_mutex);</div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span> </div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span>    <span class="keywordflow">if</span> (event_set-&gt;m_state != <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a>)</div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span>    {</div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span>      <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span>    }</div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span>    <span class="comment">// else</span></div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span> </div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span>    <span class="comment">// As explained above, perform the baseline check if necessary.</span></div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span>    <span class="keywordflow">if</span> (!event_set_check_baseline(event_set)) <span class="comment">// Method assumes m_mutex already locked.</span></div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span>    {</div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span>      <span class="comment">// Wasn&#39;t necessary (mainstream case).  Perform delta check.</span></div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span> </div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span>      <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; event_set &lt;&lt; <span class="stringliteral">&quot;] delta check started.&quot;</span>);</div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span> </div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span>      <span class="comment">/* For each type of event, run through each event we want to know about if it&#39;s true, and if</span></div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span><span class="comment">       * it&#39;s true (is in Node::m_sock_events), add it to the active events list for that event type.</span></div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span><span class="comment">       *</span></div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span><span class="comment">       * Note that if some event is desired in two Event_sets, and it has occurred, both Event_sets</span></div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span><span class="comment">       * will fire, as advertised.  It also means the user is a crazy mother, but that&#39;s not our</span></div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span><span class="comment">       * problem.... */</span></div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span> </div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span>      <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; ev_type_and_socks_from_node : m_sock_events)</div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span>      {</div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span>        <span class="keyword">const</span> <a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71">Event_set::Event_type</a> ev_type = ev_type_and_socks_from_node.first;</div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span>        <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Event_set::Sockets</a>&amp; all_can_set = ev_type_and_socks_from_node.second;</div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span> </div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span>        <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Event_set::Sockets</a>&amp; can_set = event_set-&gt;m_can[ev_type];</div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span>        <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Event_set::Sockets</a>&amp; want_set = event_set-&gt;m_want[ev_type];</div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span> </div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span>        assert(can_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#a048a8d78c4ae3bc45c8bcede6b0e2dc6">empty</a>());</div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span> </div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span>        <span class="comment">/* all_can_set is the set of all sockets for which the event has occurred, since the last baseline</span></div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span><span class="comment">         * or delta check on event_set.  Our goal is to load can_set (which is a field in</span></div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span><span class="comment">         * event_set) with all sockets for which the event has occurred AND are in want_set (a field in</span></div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span><span class="comment">         * event_set containing the sockets for which the user is interested in this event).  Therefore,</span></div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span><span class="comment">         * what we want is the set intersection of want_set and all_can_set; and we want to put the result</span></div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span><span class="comment">         * into can_set.</span></div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span><span class="comment">         *</span></div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span><span class="comment">         * Both want_set and all_can_set have O(1) search.  Therefore the fastest way to compute the</span></div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span><span class="comment">         * intersection is to pick the smaller set; iterate through each element; and save the given</span></div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span><span class="comment">         * element into can_set if it is present in the other set. */</span></div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span> </div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span>        <span class="comment">// Ensure fastness just below.</span></div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span>        <span class="keyword">static_assert</span>(<a class="code hl_class" href="classflow_1_1util_1_1Container__traits.html">util::Container_traits&lt;Event_set::Sockets&gt;::S_CONSTANT_TIME_SEARCH</a>,</div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span>                      <span class="stringliteral">&quot;Expecting amortized constant time search sockets container.&quot;</span>);</div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span>        <span class="keyword">static_assert</span>(<a class="code hl_class" href="classflow_1_1util_1_1Container__traits.html">util::Container_traits&lt;Event_set::Sockets&gt;::S_CONSTANT_TIME_INSERT</a>,</div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span>                      <span class="stringliteral">&quot;Expecting amortized constant time insertion sockets container.&quot;</span>);</div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span> </div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span>        <span class="keyword">const</span> <span class="keywordtype">bool</span> want_set_smaller = want_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#ad2ce3ff8f57696dcb230f419775ab865">size</a>() &lt; all_can_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#ad2ce3ff8f57696dcb230f419775ab865">size</a>();</div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span>        <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Event_set::Sockets</a>&amp; small_set = want_set_smaller ? want_set : all_can_set;</div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span>        <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1util_1_1Linked__hash__set.html">Event_set::Sockets</a>&amp; large_set = want_set_smaller ? all_can_set : want_set;</div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span> </div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span>        <span class="keywordflow">for</span> (<span class="keyword">const</span> any&amp; sock_as_any : small_set)</div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"> 1246</span>        {</div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span>          <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceflow_1_1util.html#a03984e29450abf9cf287c501d6c8f866">util::key_exists</a>(large_set, sock_as_any))</div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span>          {</div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span>            <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Event of type [&quot;</span> &lt;&lt; ev_type &lt;&lt; <span class="stringliteral">&quot;] for &quot;</span></div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span>                           <span class="stringliteral">&quot;socket object [&quot;</span> &lt;&lt; <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#ae04c117b15179ba37a94f6836c63497b">Event_set::sock_as_any_to_str</a>(sock_as_any) &lt;&lt; <span class="stringliteral">&quot;] detected in &quot;</span></div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span>                           <span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; event_set &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span> </div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span>            can_set.<a class="code hl_function" href="classflow_1_1util_1_1Linked__hash__set.html#a517b9b0ac9d6ab2c56e27ba380f87180">insert</a>(sock_as_any);</div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span>          }</div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span>        }</div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span>      } <span class="comment">// for ((ev_type, all_can_set) : m_sock_events)</span></div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span>    } <span class="comment">// if (!event_set_check_baseline(event_set))</span></div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span> </div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span>    <span class="comment">/* Was necessary to do baseline check.  Thus skip delta check.  Shouldn&#39;t we perform the delta check?  No.</span></div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span><span class="comment">     * The baseline check is a superset of the delta check: it simply checks each desired event&#39;s</span></div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span><span class="comment">     * socket for the desired condition.  Thus performing a delta check would be useless. */</span></div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span> </div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span>    <span class="comment">// If either check detected active events, fire this event_set (and thus move it to INACTIVE).</span></div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span>    event_set_fire_if_got_events(event_set); <span class="comment">// Method assumes m_mutex already locked.</span></div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span>  } <span class="comment">// for (all Event_sets in m_event_sets)</span></div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span> </div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span>  <span class="comment">// Each Event_set has been handled.  So begin a clean slate for the next delta check.</span></div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">Event_set::clear_ev_type_to_socks_map</a>(&amp;m_sock_events);</div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span>} <span class="comment">// Node::event_set_all_check_delta()</span></div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span> </div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a44ee0d42d38f3b98d032dee1549f8c4c"> 1271</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a44ee0d42d38f3b98d032dee1549f8c4c">Node::event_set_close</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a> event_set, <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span>{</div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span>  <span class="keyword">using </span><a class="code hl_function" href="namespaceflow_1_1async.html#a24567271e97a67d3cae6bd8bf8dc63c4">async::asio_exec_ctx_post</a>;</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span>  <span class="keyword">using </span><a class="code hl_enumeration" href="namespaceflow_1_1async.html#a0a06794b16b72f2829ce3353557c8485">async::Synchronicity</a>;</div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span>  <span class="keyword">using </span>boost::adopt_lock;</div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span> </div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span>  <span class="comment">// We are in user thread U != W.</span></div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span> </div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span>  <span class="keywordflow">if</span> (!running())</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span>  {</div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482affac5d80b4e72f2e55bbbfadce2efd2e">error::Code::S_NODE_NOT_RUNNING</a>);</div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"> 1282</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span>  }</div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"> 1285</span> </div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span>  <span class="comment">// Pre-condition is that m_mutex is locked already.</span></div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span> </div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span>  {</div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span>    <span class="comment">/* WARNING!!!  event_set-&gt;m_mutex is locked, but WE must unlock it before returning!  Can&#39;t</span></div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span><span class="comment">     * leave that to the caller, because we must unlock at a specific point below, right before</span></div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span><span class="comment">     * post()ing event_set_close_worker() onto thread W.  Use a Lock_guard that adopts an</span></div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span><span class="comment">     * already-locked mutex. */</span></div>
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span>    <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Event_set::Lock_guard</a> lock(event_set-&gt;m_mutex, adopt_lock);</div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span> </div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span>    <span class="comment">/* Put the rest of the work into thread W.  For justification, see big comment in listen().</span></div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span><span class="comment">     * Addendum regarding performance: close_abruptly() is probably called more frequently than</span></div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span><span class="comment">     * listen(), but I doubt the performance impact is serious even so.  send() and receive() might be</span></div>
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span><span class="comment">     * a different story. */</span></div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span> </div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span>    <span class="comment">// We&#39;re done -- must unlock so that thread W can do what it wants to with event_set.</span></div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span>  } <span class="comment">// lock</span></div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span> </div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span>  <span class="comment">// Load this bad boy onto thread W boost.asio work queue.  Safe to capture by &amp;reference, as we will wait.</span></div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span>  <a class="code hl_function" href="namespaceflow_1_1async.html#a24567271e97a67d3cae6bd8bf8dc63c4">asio_exec_ctx_post</a>(<a class="code hl_function" href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">get_logger</a>(), &amp;m_task_engine, Synchronicity::S_ASYNC_AND_AWAIT_CONCURRENT_COMPLETION, [&amp;]()</div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span>  {</div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span>    <span class="comment">// We are in thread W.  event_set_close() is waiting for us to set close_promise in thread U.</span></div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span> </div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span>    <span class="comment">// Something like async_wait_finish() may be setting event_set-&gt;m_state or other things... must lock.</span></div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span>    <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Event_set::Lock_guard</a> lock(event_set-&gt;m_mutex);</div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span> </div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span>    <span class="comment">/* Since we were placed onto thread W, another handler may have been executed before boost.asio</span></div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span><span class="comment">     * got to us.  Therefore we may already be S_CLOSED.  Detect this. */</span></div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span> </div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span>    <span class="keywordflow">if</span> (event_set-&gt;m_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">Event_set::State::S_CLOSED</a>) <span class="comment">// No need to lock: only W can write to this.</span></div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span>    {</div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span>      <span class="comment">// Yep, already closed.  Done.</span></div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span>      *err_code = <a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae643fd244bd1d6b483295cb9f356b0ae">error::Code::S_EVENT_SET_CLOSED</a>;</div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span>    }</div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span>    <span class="comment">// else actually do it.</span></div>
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span> </div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span>    <span class="comment">// m_mutex locked (pre-condition).</span></div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span>    event_set_close_worker(event_set);</div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span>    err_code-&gt;clear(); <span class="comment">// Success.</span></div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span>  }); <span class="comment">// asio_exec_ctx_post()</span></div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span>  <span class="comment">// If got here, the task has completed in thread W and signaled us to that effect.</span></div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span> </div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span>} <span class="comment">// Node::event_set_close()</span></div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span> </div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a6727ca42e15c8627c1ed3d94e6dd7a53"> 1330</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a6727ca42e15c8627c1ed3d94e6dd7a53">Node::event_set_close_worker</a>(<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a> event_set)</div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span>{</div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span> </div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span>  <span class="comment">// Everything already locked (explicit pre-condition).</span></div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span> </div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"> 1336</span>  <span class="comment">// Check explicitly documented pre-condition.</span></div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span>  assert((event_set-&gt;m_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">Event_set::State::S_INACTIVE</a>)</div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span>         || (event_set-&gt;m_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a>));</div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span> </div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span>  <span class="comment">/* If INACTIVE:</span></div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span><span class="comment">   *   event_set is not currently being waited on; it&#39;s in the phase where the set of desired events</span></div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span><span class="comment">   *   may be being changed, and/or the last set of fired events may be being examined; no on-event</span></div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span><span class="comment">   *   behavior could be triggered in any case.  Therefore we simply go to CLOSED state and remove</span></div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span><span class="comment">   *   event_set from the master list with no potential for controversy.</span></div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span><span class="comment">   *</span></div>
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"> 1346</span><span class="comment">   * If WAITING:</span></div>
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"> 1347</span><span class="comment">   *   We advertised in the doc comment, that we will NOT execute any on-event behavior in close().</span></div>
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"> 1348</span><span class="comment">   *   Is this OK?  There is  a chance of controversy.  There is a wait happening in some thread U</span></div>
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span><span class="comment">   *   != W.  We are currently (chronologically speaking) in the middle of some thread U&#39; != W</span></div>
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"> 1350</span><span class="comment">   *   calling event_set-&gt;close().  Let U = U&#39; (the typical case).  Then they (in thread U) must</span></div>
<div class="line"><a id="l01351" name="l01351"></a><span class="lineno"> 1351</span><span class="comment">   *   have called event_set-&gt;async_wait() and then event_set-&gt;close().  In that case, unless</span></div>
<div class="line"><a id="l01352" name="l01352"></a><span class="lineno"> 1352</span><span class="comment">   *   they&#39;re dummies, they should know that, since they&#39;re closing the thing, the wait() is to be</span></div>
<div class="line"><a id="l01353" name="l01353"></a><span class="lineno"> 1353</span><span class="comment">   *   abandoned and will never fire on-event behavior.  Therefore, as above, we just go straight to</span></div>
<div class="line"><a id="l01354" name="l01354"></a><span class="lineno"> 1354</span><span class="comment">   *   CLOSED state and not invoke any on-event behavior.  Now let U != U&#39; (atypical in general;</span></div>
<div class="line"><a id="l01355" name="l01355"></a><span class="lineno"> 1355</span><span class="comment">   *   normally one would use a given Event_set in only one thread).  Well, one thread executed</span></div>
<div class="line"><a id="l01356" name="l01356"></a><span class="lineno"> 1356</span><span class="comment">   *   async_wait(), while another executed async_close() afterwards.  Could that screw the former?</span></div>
<div class="line"><a id="l01357" name="l01357"></a><span class="lineno"> 1357</span><span class="comment">   *   If the user is unaware that he might do that to himself, yes... but that is not our problem.</span></div>
<div class="line"><a id="l01358" name="l01358"></a><span class="lineno"> 1358</span><span class="comment">   *   Therefore, OK to not perform on-event behavior and just close in this case also. */</span></div>
<div class="line"><a id="l01359" name="l01359"></a><span class="lineno"> 1359</span> </div>
<div class="line"><a id="l01360" name="l01360"></a><span class="lineno"> 1360</span>  <span class="comment">// First, set various state in *event_set.</span></div>
<div class="line"><a id="l01361" name="l01361"></a><span class="lineno"> 1361</span> </div>
<div class="line"><a id="l01362" name="l01362"></a><span class="lineno"> 1362</span>  <span class="comment">// This can be quite frequent if program uses many sync_*() methods.  Use TRACE.</span></div>
<div class="line"><a id="l01363" name="l01363"></a><span class="lineno"> 1363</span>  <a class="code hl_define" href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a>(<span class="stringliteral">&quot;Closing Event_set [&quot;</span> &lt;&lt; event_set &lt;&lt; <span class="stringliteral">&quot;]: changing state &quot;</span></div>
<div class="line"><a id="l01364" name="l01364"></a><span class="lineno"> 1364</span>                 <span class="stringliteral">&quot;from [&quot;</span> &lt;&lt; event_set-&gt;m_state &lt;&lt; <span class="stringliteral">&quot;] to [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">Event_set::State::S_CLOSED</a> &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l01365" name="l01365"></a><span class="lineno"> 1365</span> </div>
<div class="line"><a id="l01366" name="l01366"></a><span class="lineno"> 1366</span>  assert(event_set-&gt;m_state != <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">Event_set::State::S_CLOSED</a>);</div>
<div class="line"><a id="l01367" name="l01367"></a><span class="lineno"> 1367</span>  event_set-&gt;m_state = <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">Event_set::State::S_CLOSED</a>;</div>
<div class="line"><a id="l01368" name="l01368"></a><span class="lineno"> 1368</span>  event_set-&gt;m_node = 0; <span class="comment">// Maintain invariant.</span></div>
<div class="line"><a id="l01369" name="l01369"></a><span class="lineno"> 1369</span> </div>
<div class="line"><a id="l01370" name="l01370"></a><span class="lineno"> 1370</span>  <span class="comment">// Free resources.  In particular, after Event_set close, user won&#39;t be able to see last set of fired events.</span></div>
<div class="line"><a id="l01371" name="l01371"></a><span class="lineno"> 1371</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">Event_set::clear_ev_type_to_socks_map</a>(&amp;event_set-&gt;m_want);</div>
<div class="line"><a id="l01372" name="l01372"></a><span class="lineno"> 1372</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">Event_set::clear_ev_type_to_socks_map</a>(&amp;event_set-&gt;m_can);</div>
<div class="line"><a id="l01373" name="l01373"></a><span class="lineno"> 1373</span> </div>
<div class="line"><a id="l01374" name="l01374"></a><span class="lineno"> 1374</span>  <span class="comment">/* Forget the handler callback.  What if there&#39;s an outstanding async_wait()?  Well,</span></div>
<div class="line"><a id="l01375" name="l01375"></a><span class="lineno"> 1375</span><span class="comment">   * m_on_event() will NOT be called unless state is WAITING, and it won&#39;t be WAITING; it will be</span></div>
<div class="line"><a id="l01376" name="l01376"></a><span class="lineno"> 1376</span><span class="comment">   * CLOSED once this critical section is over.  So that outstanding async_wait() will never</span></div>
<div class="line"><a id="l01377" name="l01377"></a><span class="lineno"> 1377</span><span class="comment">   * &quot;finish.&quot;  However, this is explicitly documented on the public close() method.  Node shutdown</span></div>
<div class="line"><a id="l01378" name="l01378"></a><span class="lineno"> 1378</span><span class="comment">   * will avoid this problem by first closing each socket, thus waking up any waits, before</span></div>
<div class="line"><a id="l01379" name="l01379"></a><span class="lineno"> 1379</span><span class="comment">   * performing Event_set::close(). */</span></div>
<div class="line"><a id="l01380" name="l01380"></a><span class="lineno"> 1380</span>  event_set-&gt;m_on_event.clear();</div>
<div class="line"><a id="l01381" name="l01381"></a><span class="lineno"> 1381</span> </div>
<div class="line"><a id="l01382" name="l01382"></a><span class="lineno"> 1382</span>  <span class="comment">// Then remove it from the master list.</span></div>
<div class="line"><a id="l01383" name="l01383"></a><span class="lineno"> 1383</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l01384" name="l01384"></a><span class="lineno"> 1384</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> erased = 1 ==</div>
<div class="line"><a id="l01385" name="l01385"></a><span class="lineno"> 1385</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01386" name="l01386"></a><span class="lineno"> 1386</span>    m_event_sets.erase(event_set);</div>
<div class="line"><a id="l01387" name="l01387"></a><span class="lineno"> 1387</span>  assert(erased); <span class="comment">// If was not CLOSED, yet was not in m_event_sets.  So it is a serious bug somewhere.</span></div>
<div class="line"><a id="l01388" name="l01388"></a><span class="lineno"> 1388</span>} <span class="comment">// Node::event_set_close_worker()</span></div>
<div class="line"><a id="l01389" name="l01389"></a><span class="lineno"> 1389</span> </div>
<div class="line"><a id="l01390" name="l01390"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#a1124027c715d674f113f2d961e4c6861"> 1390</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#a1124027c715d674f113f2d961e4c6861">Node::interrupt_all_waits</a>(<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* err_code)</div>
<div class="line"><a id="l01391" name="l01391"></a><span class="lineno"> 1391</span>{</div>
<div class="line"><a id="l01392" name="l01392"></a><span class="lineno"> 1392</span>  <span class="keyword">using </span>boost::asio::post;</div>
<div class="line"><a id="l01393" name="l01393"></a><span class="lineno"> 1393</span> </div>
<div class="line"><a id="l01394" name="l01394"></a><span class="lineno"> 1394</span>  <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceflow_1_1error.html#a48afa7f8c2e100acd461365dfb00a114">flow::error::exec_void_and_throw_on_error</a></div>
<div class="line"><a id="l01395" name="l01395"></a><span class="lineno"> 1395</span>        ([<span class="keyword">this</span>](<a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>* actual_err_code) { interrupt_all_waits(actual_err_code); },</div>
<div class="line"><a id="l01396" name="l01396"></a><span class="lineno"> 1396</span>         err_code, <a class="code hl_define" href="util__fwd_8hpp.html#a0cc4c82ac54e53b7a8a2431b66ff30df">FLOW_UTIL_WHERE_AM_I_STR</a>()))</div>
<div class="line"><a id="l01397" name="l01397"></a><span class="lineno"> 1397</span>  {</div>
<div class="line"><a id="l01398" name="l01398"></a><span class="lineno"> 1398</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01399" name="l01399"></a><span class="lineno"> 1399</span>  }</div>
<div class="line"><a id="l01400" name="l01400"></a><span class="lineno"> 1400</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01401" name="l01401"></a><span class="lineno"> 1401</span> </div>
<div class="line"><a id="l01402" name="l01402"></a><span class="lineno"> 1402</span>  <span class="comment">// We are in thread U != W.</span></div>
<div class="line"><a id="l01403" name="l01403"></a><span class="lineno"> 1403</span> </div>
<div class="line"><a id="l01404" name="l01404"></a><span class="lineno"> 1404</span>  <span class="keywordflow">if</span> (!running())</div>
<div class="line"><a id="l01405" name="l01405"></a><span class="lineno"> 1405</span>  {</div>
<div class="line"><a id="l01406" name="l01406"></a><span class="lineno"> 1406</span>    <a class="code hl_define" href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a>(<a class="code hl_enumvalue" href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482affac5d80b4e72f2e55bbbfadce2efd2e">error::Code::S_NODE_NOT_RUNNING</a>);</div>
<div class="line"><a id="l01407" name="l01407"></a><span class="lineno"> 1407</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01408" name="l01408"></a><span class="lineno"> 1408</span>  }</div>
<div class="line"><a id="l01409" name="l01409"></a><span class="lineno"> 1409</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01410" name="l01410"></a><span class="lineno"> 1410</span> </div>
<div class="line"><a id="l01411" name="l01411"></a><span class="lineno"> 1411</span>  <span class="comment">/* Put the rest of the work into thread W.  For justification, see big comment in listen().</span></div>
<div class="line"><a id="l01412" name="l01412"></a><span class="lineno"> 1412</span><span class="comment">   * Addendum regarding performance: interrupt_all_waits() should be pretty rare. */</span></div>
<div class="line"><a id="l01413" name="l01413"></a><span class="lineno"> 1413</span> </div>
<div class="line"><a id="l01414" name="l01414"></a><span class="lineno"> 1414</span>  post(m_task_engine, [<span class="keyword">this</span>]() { interrupt_all_waits_worker(); });</div>
<div class="line"><a id="l01415" name="l01415"></a><span class="lineno"> 1415</span> </div>
<div class="line"><a id="l01416" name="l01416"></a><span class="lineno"> 1416</span>  err_code-&gt;clear();</div>
<div class="line"><a id="l01417" name="l01417"></a><span class="lineno"> 1417</span>} <span class="comment">// Node::interrupt_all_waits()</span></div>
<div class="line"><a id="l01418" name="l01418"></a><span class="lineno"> 1418</span> </div>
<div class="line"><a id="l01419" name="l01419"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#ad2840a7a95f16b7e222e449e3d6b9aca"> 1419</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ad2840a7a95f16b7e222e449e3d6b9aca">Node::interrupt_all_waits_worker</a>()</div>
<div class="line"><a id="l01420" name="l01420"></a><span class="lineno"> 1420</span>{</div>
<div class="line"><a id="l01421" name="l01421"></a><span class="lineno"> 1421</span>  <span class="comment">// We are in thread W.</span></div>
<div class="line"><a id="l01422" name="l01422"></a><span class="lineno"> 1422</span> </div>
<div class="line"><a id="l01423" name="l01423"></a><span class="lineno"> 1423</span>  <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;Executing request to interrupt all waiting Event_sets.&quot;</span>);</div>
<div class="line"><a id="l01424" name="l01424"></a><span class="lineno"> 1424</span> </div>
<div class="line"><a id="l01425" name="l01425"></a><span class="lineno"> 1425</span>  <span class="keywordflow">for</span> (<a class="code hl_typedef" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Event_set::Ptr</a> event_set : m_event_sets)</div>
<div class="line"><a id="l01426" name="l01426"></a><span class="lineno"> 1426</span>  {</div>
<div class="line"><a id="l01427" name="l01427"></a><span class="lineno"> 1427</span>    <span class="comment">// Work on one Event_set at a time.  Lock it.</span></div>
<div class="line"><a id="l01428" name="l01428"></a><span class="lineno"> 1428</span>    <a class="code hl_typedef" href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">Event_set::Lock_guard</a> lock(event_set-&gt;m_mutex);</div>
<div class="line"><a id="l01429" name="l01429"></a><span class="lineno"> 1429</span> </div>
<div class="line"><a id="l01430" name="l01430"></a><span class="lineno"> 1430</span>    <span class="keywordflow">if</span> (event_set-&gt;m_state == <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a>)</div>
<div class="line"><a id="l01431" name="l01431"></a><span class="lineno"> 1431</span>    {</div>
<div class="line"><a id="l01432" name="l01432"></a><span class="lineno"> 1432</span>      <span class="comment">/* The code here is based on event_set_fire_if_got_events(). This is another type of an event being &quot;ready&quot;;</span></div>
<div class="line"><a id="l01433" name="l01433"></a><span class="lineno"> 1433</span><span class="comment">       * it&#39;s just that it&#39;s ready because of it being interrupted instead of due to the actual waited-on condition</span></div>
<div class="line"><a id="l01434" name="l01434"></a><span class="lineno"> 1434</span><span class="comment">       * becoming true. Keeping comments light to avoid redundancy/maintenance issues.</span></div>
<div class="line"><a id="l01435" name="l01435"></a><span class="lineno"> 1435</span><span class="comment">       *</span></div>
<div class="line"><a id="l01436" name="l01436"></a><span class="lineno"> 1436</span><span class="comment">       * If editing this, check event_set_fire_if_got_events() also. */</span></div>
<div class="line"><a id="l01437" name="l01437"></a><span class="lineno"> 1437</span> </div>
<div class="line"><a id="l01438" name="l01438"></a><span class="lineno"> 1438</span>      <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;Event_set [&quot;</span> &lt;&lt; event_set &lt;&lt; <span class="stringliteral">&quot;] is being interrupted; firing and moving from &quot;</span></div>
<div class="line"><a id="l01439" name="l01439"></a><span class="lineno"> 1439</span>                    <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">Event_set::State::S_WAITING</a> &lt;&lt; <span class="stringliteral">&quot;] to [&quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">Event_set::State::S_INACTIVE</a> &lt;&lt; <span class="stringliteral">&quot;] again.&quot;</span>);</div>
<div class="line"><a id="l01440" name="l01440"></a><span class="lineno"> 1440</span> </div>
<div class="line"><a id="l01441" name="l01441"></a><span class="lineno"> 1441</span>      <span class="comment">/* As promised, the interrupted case means these will be empty.  The actual calls may not be necessary, as maybe</span></div>
<div class="line"><a id="l01442" name="l01442"></a><span class="lineno"> 1442</span><span class="comment">       * adding elements to these always immediately (within same m_mutex locking) leads to going to S_INACTIVE state,</span></div>
<div class="line"><a id="l01443" name="l01443"></a><span class="lineno"> 1443</span><span class="comment">       * meaning the present code would not be executing.  However, no need to rely on that; quite possibly we could</span></div>
<div class="line"><a id="l01444" name="l01444"></a><span class="lineno"> 1444</span><span class="comment">       * have code that would load stuff into event_set-&gt;m_can and only go to S_WAITING in another callback. */</span></div>
<div class="line"><a id="l01445" name="l01445"></a><span class="lineno"> 1445</span>      <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">Event_set::clear_ev_type_to_socks_map</a>(&amp;event_set-&gt;m_can);</div>
<div class="line"><a id="l01446" name="l01446"></a><span class="lineno"> 1446</span> </div>
<div class="line"><a id="l01447" name="l01447"></a><span class="lineno"> 1447</span>      event_set-&gt;m_on_event(<span class="keyword">true</span>); <span class="comment">// true means firing due to interruption, not due to waited-on condition being true.</span></div>
<div class="line"><a id="l01448" name="l01448"></a><span class="lineno"> 1448</span>      event_set-&gt;m_on_event.clear();</div>
<div class="line"><a id="l01449" name="l01449"></a><span class="lineno"> 1449</span>      event_set-&gt;m_state = <a class="code hl_enumvalue" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">Event_set::State::S_INACTIVE</a>;</div>
<div class="line"><a id="l01450" name="l01450"></a><span class="lineno"> 1450</span>    }</div>
<div class="line"><a id="l01451" name="l01451"></a><span class="lineno"> 1451</span>  } <span class="comment">// for (all Event_sets in m_event_sets)</span></div>
<div class="line"><a id="l01452" name="l01452"></a><span class="lineno"> 1452</span>} <span class="comment">// Node::interrupt_all_waits_worker()</span></div>
<div class="line"><a id="l01453" name="l01453"></a><span class="lineno"> 1453</span> </div>
<div class="line"><a id="l01454" name="l01454"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Node.html#ae996cab95eb139d00f0d430093e64a5f"> 1454</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1net__flow_1_1Node.html#ae996cab95eb139d00f0d430093e64a5f">Node::interrupt_all_waits_internal_sig_handler</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>&amp; sys_err_code, <span class="keywordtype">int</span> sig_number)</div>
<div class="line"><a id="l01455" name="l01455"></a><span class="lineno"> 1455</span>{</div>
<div class="line"><a id="l01456" name="l01456"></a><span class="lineno"> 1456</span>  <span class="comment">// We are in thread W.  (Yes. This is a contract of this function.)</span></div>
<div class="line"><a id="l01457" name="l01457"></a><span class="lineno"> 1457</span> </div>
<div class="line"><a id="l01458" name="l01458"></a><span class="lineno"> 1458</span>  <span class="keywordflow">if</span> (sys_err_code == boost::asio::error::operation_aborted)</div>
<div class="line"><a id="l01459" name="l01459"></a><span class="lineno"> 1459</span>  {</div>
<div class="line"><a id="l01460" name="l01460"></a><span class="lineno"> 1460</span>    <span class="keywordflow">return</span>; <span class="comment">// Stuff is shutting down; just get out.</span></div>
<div class="line"><a id="l01461" name="l01461"></a><span class="lineno"> 1461</span>  }</div>
<div class="line"><a id="l01462" name="l01462"></a><span class="lineno"> 1462</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01463" name="l01463"></a><span class="lineno"> 1463</span> </div>
<div class="line"><a id="l01464" name="l01464"></a><span class="lineno"> 1464</span>  <a class="code hl_define" href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a>(<span class="stringliteral">&quot;Internal interrupt signal handler executed with signal number [&quot;</span> &lt;&lt; sig_number &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l01465" name="l01465"></a><span class="lineno"> 1465</span> </div>
<div class="line"><a id="l01466" name="l01466"></a><span class="lineno"> 1466</span>  <span class="keywordflow">if</span> (sys_err_code)</div>
<div class="line"><a id="l01467" name="l01467"></a><span class="lineno"> 1467</span>  {</div>
<div class="line"><a id="l01468" name="l01468"></a><span class="lineno"> 1468</span>    <span class="comment">// This is odd, but there&#39;s no need to freak out about anything else.  Just log and get out.</span></div>
<div class="line"><a id="l01469" name="l01469"></a><span class="lineno"> 1469</span>    <a class="code hl_define" href="error_2error_8hpp.html#a019ee6e90802e444572dd78d312d6e23">FLOW_ERROR_SYS_ERROR_LOG_WARNING</a>();</div>
<div class="line"><a id="l01470" name="l01470"></a><span class="lineno"> 1470</span>    <a class="code hl_define" href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a>(<span class="stringliteral">&quot;Internal signal handler executed with unexpected error indicator.  Strange!  &quot;</span></div>
<div class="line"><a id="l01471" name="l01471"></a><span class="lineno"> 1471</span>                     <span class="stringliteral">&quot;Ignoring and continuing other operation.&quot;</span>);</div>
<div class="line"><a id="l01472" name="l01472"></a><span class="lineno"> 1472</span>  }</div>
<div class="line"><a id="l01473" name="l01473"></a><span class="lineno"> 1473</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l01474" name="l01474"></a><span class="lineno"> 1474</span>  {</div>
<div class="line"><a id="l01475" name="l01475"></a><span class="lineno"> 1475</span>    <span class="comment">/* To the user, this default signal handler is just supposed to call Node::interrupt_all_waits().</span></div>
<div class="line"><a id="l01476" name="l01476"></a><span class="lineno"> 1476</span><span class="comment">     * It&#39;s a convenience thing, in case they don&#39;t want to set up their own signal handler that&#39;ll do that, and also</span></div>
<div class="line"><a id="l01477" name="l01477"></a><span class="lineno"> 1477</span><span class="comment">     * they don&#39;t need any of their own custom signal handling that may have nothing to do with net_flow at all.</span></div>
<div class="line"><a id="l01478" name="l01478"></a><span class="lineno"> 1478</span><span class="comment">     * Actually they can even have the latter -- as long as it uses signal_set also.</span></div>
<div class="line"><a id="l01479" name="l01479"></a><span class="lineno"> 1479</span><span class="comment">     * (If they do need some other handling, they MUST disable this feature via Node_options. Then we wouldn&#39;t be</span></div>
<div class="line"><a id="l01480" name="l01480"></a><span class="lineno"> 1480</span><span class="comment">     * called.) */</span></div>
<div class="line"><a id="l01481" name="l01481"></a><span class="lineno"> 1481</span> </div>
<div class="line"><a id="l01482" name="l01482"></a><span class="lineno"> 1482</span>    <span class="comment">// This must be run in thread W, and indeed we are in thread W by contract. It&#39;ll log further, so just call it.</span></div>
<div class="line"><a id="l01483" name="l01483"></a><span class="lineno"> 1483</span>    interrupt_all_waits_worker();</div>
<div class="line"><a id="l01484" name="l01484"></a><span class="lineno"> 1484</span>  }</div>
<div class="line"><a id="l01485" name="l01485"></a><span class="lineno"> 1485</span> </div>
<div class="line"><a id="l01486" name="l01486"></a><span class="lineno"> 1486</span>  <span class="comment">// Wait for it again, or else this will work only the first time signal is sent.</span></div>
<div class="line"><a id="l01487" name="l01487"></a><span class="lineno"> 1487</span>  m_signal_set.async_wait([<span class="keyword">this</span>](<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>&amp; sys_err_code, <span class="keywordtype">int</span> sig_num)</div>
<div class="line"><a id="l01488" name="l01488"></a><span class="lineno"> 1488</span>  {</div>
<div class="line"><a id="l01489" name="l01489"></a><span class="lineno"> 1489</span>    interrupt_all_waits_internal_sig_handler(sys_err_code, sig_num);</div>
<div class="line"><a id="l01490" name="l01490"></a><span class="lineno"> 1490</span>  });</div>
<div class="line"><a id="l01491" name="l01491"></a><span class="lineno"> 1491</span>} <span class="comment">// Node::interrupt_all_waits_internal_sig_handler()</span></div>
<div class="line"><a id="l01492" name="l01492"></a><span class="lineno"> 1492</span> </div>
<div class="line"><a id="l01493" name="l01493"></a><span class="lineno"> 1493</span><span class="comment">// Free implementations.</span></div>
<div class="line"><a id="l01494" name="l01494"></a><span class="lineno"> 1494</span><span class="comment"></span> </div>
<div class="line"><a id="l01495" name="l01495"></a><span class="lineno"> 1495</span><span class="comment">/// @cond</span></div>
<div class="line"><a id="l01496" name="l01496"></a><span class="lineno"> 1496</span><span class="comment"></span><span class="comment">/* -^- Doxygen, please ignore the following.  (Don&#39;t want docs generated for temp macro; this is more maintainable</span></div>
<div class="line"><a id="l01497" name="l01497"></a><span class="lineno"> 1497</span><span class="comment"> * than specifying the macro name to omit it, in Doxygen-config EXCLUDE_SYMBOLS.) */</span></div>
<div class="line"><a id="l01498" name="l01498"></a><span class="lineno"> 1498</span> </div>
<div class="line"><a id="l01499" name="l01499"></a><span class="lineno"> 1499</span><span class="comment">// That&#39;s right, I did this.  Wanna fight about it?</span></div>
<div class="line"><a id="l01500" name="l01500"></a><span class="lineno"> 1500</span><span class="preprocessor">#define STATE_TO_CASE_STATEMENT(ARG_state) \</span></div>
<div class="line"><a id="l01501" name="l01501"></a><span class="lineno"> 1501</span><span class="preprocessor">  case Event_set::State::S_##ARG_state: \</span></div>
<div class="line"><a id="l01502" name="l01502"></a><span class="lineno"> 1502</span><span class="preprocessor">    return os &lt;&lt; #ARG_state</span></div>
<div class="line"><a id="l01503" name="l01503"></a><span class="lineno"> 1503</span> </div>
<div class="line"><a id="l01504" name="l01504"></a><span class="lineno"> 1504</span><span class="comment">// -v- Doxygen, please stop ignoring.</span><span class="comment"></span></div>
<div class="line"><a id="l01505" name="l01505"></a><span class="lineno"> 1505</span><span class="comment">/// @endcond</span></div>
<div class="line"><a id="l01506" name="l01506"></a><span class="lineno"> 1506</span><span class="comment"></span> </div>
<div class="line"><a id="l01507" name="l01507"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#aebbf2b8f19e2b3d887fe234cd5bdcffc"> 1507</a></span>std::ostream&amp; <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#aebbf2b8f19e2b3d887fe234cd5bdcffc">operator&lt;&lt;</a>(std::ostream&amp; os, <a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975">Event_set::State</a> <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a8453cccdaaf22ea6b027c5de9738f0f0">state</a>)</div>
<div class="line"><a id="l01508" name="l01508"></a><span class="lineno"> 1508</span>{</div>
<div class="line"><a id="l01509" name="l01509"></a><span class="lineno"> 1509</span>  <span class="keywordflow">switch</span> (<a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#a8453cccdaaf22ea6b027c5de9738f0f0">state</a>)</div>
<div class="line"><a id="l01510" name="l01510"></a><span class="lineno"> 1510</span>  {</div>
<div class="line"><a id="l01511" name="l01511"></a><span class="lineno"> 1511</span>    STATE_TO_CASE_STATEMENT(INACTIVE);</div>
<div class="line"><a id="l01512" name="l01512"></a><span class="lineno"> 1512</span>    STATE_TO_CASE_STATEMENT(WAITING);</div>
<div class="line"><a id="l01513" name="l01513"></a><span class="lineno"> 1513</span>    STATE_TO_CASE_STATEMENT(CLOSED);</div>
<div class="line"><a id="l01514" name="l01514"></a><span class="lineno"> 1514</span>  }</div>
<div class="line"><a id="l01515" name="l01515"></a><span class="lineno"> 1515</span>  <span class="keywordflow">return</span> os;</div>
<div class="line"><a id="l01516" name="l01516"></a><span class="lineno"> 1516</span><span class="preprocessor">#undef STATE_TO_CASE_STATEMENT</span></div>
<div class="line"><a id="l01517" name="l01517"></a><span class="lineno"> 1517</span>}</div>
<div class="line"><a id="l01518" name="l01518"></a><span class="lineno"> 1518</span><span class="comment"></span> </div>
<div class="line"><a id="l01519" name="l01519"></a><span class="lineno"> 1519</span><span class="comment">/// @cond</span></div>
<div class="line"><a id="l01520" name="l01520"></a><span class="lineno"> 1520</span><span class="comment"></span><span class="comment">// -^- Doxygen, please ignore the following.  (Same deal as just above.)</span></div>
<div class="line"><a id="l01521" name="l01521"></a><span class="lineno"> 1521</span> </div>
<div class="line"><a id="l01522" name="l01522"></a><span class="lineno"> 1522</span><span class="comment">// That&#39;s right, I did this.  Wanna fight about it?</span></div>
<div class="line"><a id="l01523" name="l01523"></a><span class="lineno"> 1523</span><span class="preprocessor">#define TYPE_TO_CASE_STATEMENT(ARG_type) \</span></div>
<div class="line"><a id="l01524" name="l01524"></a><span class="lineno"> 1524</span><span class="preprocessor">  case Event_set::Event_type::S_##ARG_type: \</span></div>
<div class="line"><a id="l01525" name="l01525"></a><span class="lineno"> 1525</span><span class="preprocessor">    return os &lt;&lt; #ARG_type</span></div>
<div class="line"><a id="l01526" name="l01526"></a><span class="lineno"> 1526</span> </div>
<div class="line"><a id="l01527" name="l01527"></a><span class="lineno"> 1527</span><span class="comment">// -v- Doxygen, please stop ignoring.</span><span class="comment"></span></div>
<div class="line"><a id="l01528" name="l01528"></a><span class="lineno"> 1528</span><span class="comment">/// @endcond</span></div>
<div class="line"><a id="l01529" name="l01529"></a><span class="lineno"> 1529</span><span class="comment"></span> </div>
<div class="line"><a id="l01530" name="l01530"></a><span class="lineno"><a class="line" href="classflow_1_1net__flow_1_1Event__set.html#ac57b16fd356cacb8432a8ce7b021b54c"> 1530</a></span>std::ostream&amp; <a class="code hl_function" href="classflow_1_1net__flow_1_1Event__set.html#aebbf2b8f19e2b3d887fe234cd5bdcffc">operator&lt;&lt;</a>(std::ostream&amp; os, <a class="code hl_enumeration" href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71">Event_set::Event_type</a> ev_type)</div>
<div class="line"><a id="l01531" name="l01531"></a><span class="lineno"> 1531</span>{</div>
<div class="line"><a id="l01532" name="l01532"></a><span class="lineno"> 1532</span> </div>
<div class="line"><a id="l01533" name="l01533"></a><span class="lineno"> 1533</span>  <span class="keywordflow">switch</span> (ev_type)</div>
<div class="line"><a id="l01534" name="l01534"></a><span class="lineno"> 1534</span>  {</div>
<div class="line"><a id="l01535" name="l01535"></a><span class="lineno"> 1535</span>    TYPE_TO_CASE_STATEMENT(PEER_SOCKET_READABLE);</div>
<div class="line"><a id="l01536" name="l01536"></a><span class="lineno"> 1536</span>    TYPE_TO_CASE_STATEMENT(PEER_SOCKET_WRITABLE);</div>
<div class="line"><a id="l01537" name="l01537"></a><span class="lineno"> 1537</span>    TYPE_TO_CASE_STATEMENT(SERVER_SOCKET_ACCEPTABLE);</div>
<div class="line"><a id="l01538" name="l01538"></a><span class="lineno"> 1538</span>  }</div>
<div class="line"><a id="l01539" name="l01539"></a><span class="lineno"> 1539</span>  <span class="keywordflow">return</span> os;</div>
<div class="line"><a id="l01540" name="l01540"></a><span class="lineno"> 1540</span><span class="preprocessor">#undef TYPE_TO_CASE_STATEMENT</span></div>
<div class="line"><a id="l01541" name="l01541"></a><span class="lineno"> 1541</span>}</div>
<div class="line"><a id="l01542" name="l01542"></a><span class="lineno"> 1542</span> </div>
<div class="line"><a id="l01543" name="l01543"></a><span class="lineno"> 1543</span>} <span class="comment">// namepace flow::net_flow</span></div>
<div class="ttc" id="aasync_2util_8hpp_html"><div class="ttname"><a href="async_2util_8hpp.html">util.hpp</a></div></div>
<div class="ttc" id="aclassbool_html"><div class="ttname"><a href="classbool.html">bool</a></div></div>
<div class="ttc" id="aclassflow_1_1Function_html"><div class="ttname"><a href="classflow_1_1Function.html">flow::Function&lt; void(bool)&gt;</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Log__context_html_af4db395042b065b00398cd59845dcb4d"><div class="ttname"><a href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">flow::log::Log_context::get_logger</a></div><div class="ttdeci">Logger * get_logger() const</div><div class="ttdoc">Returns the stored Logger pointer, particularly as many FLOW_LOG_*() macros expect.</div><div class="ttdef"><b>Definition:</b> <a href="log_8cpp_source.html#l00217">log.cpp:217</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Logger_html"><div class="ttname"><a href="classflow_1_1log_1_1Logger.html">flow::log::Logger</a></div><div class="ttdoc">Interface that the user should implement, passing the implementing Logger into logging classes (Flow'...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l01280">log.hpp:1284</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_1_1Socket__as__any__equals_html_a2651cf79dd65bdc60707ff3a368f5d9a"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set_1_1Socket__as__any__equals.html#a2651cf79dd65bdc60707ff3a368f5d9a">flow::net_flow::Event_set::Socket_as_any_equals::operator()</a></div><div class="ttdeci">bool operator()(const boost::any &amp;sock_as_any1, const boost::any &amp;sock_as_any2) const</div><div class="ttdoc">Returns whether the two objects, which must be stored in Sockets objects, are equal by value.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00836">event_set.cpp:836</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_1_1Socket__as__any__hash_html_acdda0f516ad0c1e562ff1797cea653cc"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set_1_1Socket__as__any__hash.html#acdda0f516ad0c1e562ff1797cea653cc">flow::net_flow::Event_set::Socket_as_any_hash::operator()</a></div><div class="ttdeci">size_t operator()(const boost::any &amp;sock_as_any) const</div><div class="ttdoc">Returns hash value of the given object which must be stored in a Sockets object.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00807">event_set.cpp:807</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a0dda853ab017dd9bfcfb71b601d15698"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a0dda853ab017dd9bfcfb71b601d15698">flow::net_flow::Event_set::m_mutex</a></div><div class="ttdeci">Mutex m_mutex</div><div class="ttdoc">Mutex protecting ALL data in this object.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00937">event_set.hpp:937</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a0edced1cb69b2cad299ee32e652ccea7"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a0edced1cb69b2cad299ee32e652ccea7">flow::net_flow::Event_set::clear_ev_type_to_socks_map</a></div><div class="ttdeci">static void clear_ev_type_to_socks_map(Ev_type_to_socks_map *ev_type_to_socks_map)</div><div class="ttdoc">Helper that clears each Sockets set inside an Ev_type_to_socks_map.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00745">event_set.cpp:745</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a133c518168fe3922ab6729a99077dd3f"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a133c518168fe3922ab6729a99077dd3f">flow::net_flow::Event_set::sync_wait</a></div><div class="ttdeci">bool sync_wait(Error_code *err_code=0)</div><div class="ttdoc">Blocks indefinitely until one or more of the previously described events hold – or the wait is interr...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00457">event_set.cpp:457</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a13a17c404f0ce43da5fec53a550da9be"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a13a17c404f0ce43da5fec53a550da9be">flow::net_flow::Event_set::sync_wait_impl</a></div><div class="ttdeci">bool sync_wait_impl(const Fine_duration &amp;max_wait, Error_code *err_code)</div><div class="ttdoc">Same as the public sync_wait(max_wait) but uses a Fine_clock-based Fine_duration non-template type fo...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00335">event_set.cpp:335</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a19cc3a286c8a11c986d2a59ec1e39a71"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71">flow::net_flow::Event_set::Event_type</a></div><div class="ttdeci">Event_type</div><div class="ttdoc">Type of event or condition of interest supported by class Event_set.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00306">event_set.hpp:307</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a19cc3a286c8a11c986d2a59ec1e39a71a5efb94617bcb00507a087224ce7a7d02"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71a5efb94617bcb00507a087224ce7a7d02">flow::net_flow::Event_set::Event_type::S_PEER_SOCKET_WRITABLE</a></div><div class="ttdeci">@ S_PEER_SOCKET_WRITABLE</div><div class="ttdoc">Event type specifying the condition of interest wherein a target Peer_socket sock is such that callin...</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a19cc3a286c8a11c986d2a59ec1e39a71a7cedcbdde2b86daeb1268c63c6cb6b88"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71a7cedcbdde2b86daeb1268c63c6cb6b88">flow::net_flow::Event_set::Event_type::S_PEER_SOCKET_READABLE</a></div><div class="ttdeci">@ S_PEER_SOCKET_READABLE</div><div class="ttdoc">Event type specifying the condition of interest wherein a target Peer_socket sock is such that callin...</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a19cc3a286c8a11c986d2a59ec1e39a71afb218b0110d3f9f26ee089bad2e0eba2"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a19cc3a286c8a11c986d2a59ec1e39a71afb218b0110d3f9f26ee089bad2e0eba2">flow::net_flow::Event_set::Event_type::S_SERVER_SOCKET_ACCEPTABLE</a></div><div class="ttdeci">@ S_SERVER_SOCKET_ACCEPTABLE</div><div class="ttdoc">Event type specifying the condition of interest wherein a target Server_socket serv is such that call...</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a19e241ae4dfe1ea54de6027052bc2135"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a19e241ae4dfe1ea54de6027052bc2135">flow::net_flow::Event_set::ev_type_to_socks_map_sizes_to_str</a></div><div class="ttdeci">static std::string ev_type_to_socks_map_sizes_to_str(const Ev_type_to_socks_map &amp;ev_type_to_socks_map)</div><div class="ttdoc">Helper that returns a loggable string summarizing the sizes of the socket sets, by type,...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00759">event_set.cpp:759</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a2855bd159b6e63bf448ed1f41b608975"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975">flow::net_flow::Event_set::State</a></div><div class="ttdeci">State</div><div class="ttdoc">A state of an Event_set.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00259">event_set.hpp:260</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a48954e0be2947224e80cdfc2283af906">flow::net_flow::Event_set::State::S_WAITING</a></div><div class="ttdeci">@ S_WAITING</div><div class="ttdoc">Waiting state: valid Event_set that is currently waiting on previously described events.</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a6abcbd1be8478aa03e76aec9c540e14f">flow::net_flow::Event_set::State::S_CLOSED</a></div><div class="ttdeci">@ S_CLOSED</div><div class="ttdoc">Node has disowned the Peer_socket; all further operations will result in error.</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a2855bd159b6e63bf448ed1f41b608975a9ed0ac855342c04cf614bf2fb5549657">flow::net_flow::Event_set::State::S_INACTIVE</a></div><div class="ttdeci">@ S_INACTIVE</div><div class="ttdoc">Default state; valid Event_set that is not currently waiting on events.</div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a3122100c044da08495fac737998f60db"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a3122100c044da08495fac737998f60db">flow::net_flow::Event_set::async_wait_finish</a></div><div class="ttdeci">bool async_wait_finish(Error_code *err_code=0)</div><div class="ttdoc">Moves object from State::S_WAITING to State::S_INACTIVE, and forgets any handler saved by async_wait(...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00214">event_set.cpp:214</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a314635daf8fdf3805868baff8b42cfc9"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a314635daf8fdf3805868baff8b42cfc9">flow::net_flow::Event_set::events_detected</a></div><div class="ttdeci">bool events_detected(Error_code *err_code=0) const</div><div class="ttdoc">Returns true if and only if the last wait, if any, detected at least one event.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00574">event_set.cpp:574</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a412214de6a4f3a1ff1e86ddb1975f47b"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a412214de6a4f3a1ff1e86ddb1975f47b">flow::net_flow::Event_set::poll</a></div><div class="ttdeci">bool poll(Error_code *err_code=0)</div><div class="ttdoc">Checks for all previously described events that currently hold, saves them for retrieval via emit_res...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00265">event_set.cpp:265</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a43dfb881ab3a9488a6a60dd83ad21c85"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a43dfb881ab3a9488a6a60dd83ad21c85">flow::net_flow::Event_set::async_wait</a></div><div class="ttdeci">bool async_wait(const Event_handler &amp;on_event, Error_code *err_code=0)</div><div class="ttdoc">Moves object to State::S_WAITING state, saves the given handler to be executed later (in a different,...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00072">event_set.cpp:72</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a56925e15b38d285f387e10bfb18f93c9"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a56925e15b38d285f387e10bfb18f93c9">flow::net_flow::Event_set::m_state</a></div><div class="ttdeci">State m_state</div><div class="ttdoc">See state(). Should be set before user gets access to *this. Must not be modified by non-W threads af...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00901">event_set.hpp:901</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a592b3ce6602051bd9994216041a3cbdc"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a592b3ce6602051bd9994216041a3cbdc">flow::net_flow::Event_set::Sockets</a></div><div class="ttdeci">util::Linked_hash_set&lt; boost::any, Socket_as_any_hash, Socket_as_any_equals &gt; Sockets</div><div class="ttdoc">A set of sockets of one type, used to communicate sets of desired and resulting events in various Eve...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00372">event_set.hpp:372</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a59f6ddb0d0258cc029c435a8ed0f89f7"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a59f6ddb0d0258cc029c435a8ed0f89f7">flow::net_flow::Event_set::m_on_event</a></div><div class="ttdeci">Event_handler m_on_event</div><div class="ttdoc">During State::S_WAITING, stores the handler (a void function with 1 bool argument) that will be calle...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00926">event_set.hpp:926</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a6e47fc394c09acf4d100a640e090a7aa"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a6e47fc394c09acf4d100a640e090a7aa">flow::net_flow::Event_set::swap_wanted_sockets</a></div><div class="ttdeci">bool swap_wanted_sockets(Sockets *target_set, Event_type ev_type, Error_code *err_code)</div><div class="ttdoc">Efficiently exchanges the current set of sockets we want to know are &quot;ready&quot; by the definiton of the ...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00492">event_set.cpp:492</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a72b26f25a2e76e3c61b4760b59de5b25"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a72b26f25a2e76e3c61b4760b59de5b25">flow::net_flow::Event_set::emit_result_sockets</a></div><div class="ttdeci">bool emit_result_sockets(Sockets *target_set, Event_type ev_type, Error_code *err_code=0)</div><div class="ttdoc">Gets the sockets that satisfy the condition of the given Event_type detected during the last wait.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00611">event_set.cpp:611</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a79d75ea514f571d9f6bd2cfcad502f22"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a79d75ea514f571d9f6bd2cfcad502f22">flow::net_flow::Event_set::empty_ev_type_to_socks_map</a></div><div class="ttdeci">static Ev_type_to_socks_map empty_ev_type_to_socks_map()</div><div class="ttdoc">Creates a maximally empty Ev_type_to_socks_map: it will have all possible Event_type as keys but only...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00734">event_set.cpp:734</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a7b8e6cf7046b6905015301a203cd88f5"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a7b8e6cf7046b6905015301a203cd88f5">flow::net_flow::Event_set::Event_set</a></div><div class="ttdeci">Event_set(log::Logger *logger_ptr)</div><div class="ttdoc">Constructs object; initializes all values to well-defined but possibly meaningless values (0,...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00042">event_set.cpp:42</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a7e6ff0e1ad4c13220a371045101a5eff"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a7e6ff0e1ad4c13220a371045101a5eff">flow::net_flow::Event_set::Lock_guard</a></div><div class="ttdeci">util::Lock_guard&lt; Mutex &gt; Lock_guard</div><div class="ttdoc">Short-hand for RAII lock guard of Mutex. Use instead of boost::lock_guard for release() at least.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00791">event_set.hpp:791</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a8453cccdaaf22ea6b027c5de9738f0f0"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a8453cccdaaf22ea6b027c5de9738f0f0">flow::net_flow::Event_set::state</a></div><div class="ttdeci">State state() const</div><div class="ttdoc">Current State of the Event_set.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00060">event_set.cpp:60</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a86ddd6fb8874d85869157bae2ffda69b"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a86ddd6fb8874d85869157bae2ffda69b">flow::net_flow::Event_set::clear_wanted_sockets</a></div><div class="ttdeci">bool clear_wanted_sockets(Event_type ev_type, Error_code *err_code=0)</div><div class="ttdoc">Identical to swap_wanted_sockets(&amp;sockets, ev_type, err_code), where originally sockets is empty and ...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00525">event_set.cpp:525</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a8e16d91f81860eb2a6c971863548e466"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a8e16d91f81860eb2a6c971863548e466">flow::net_flow::Event_set::ok_to_mod_socket_set</a></div><div class="ttdeci">bool ok_to_mod_socket_set(Error_code *err_code) const</div><div class="ttdoc">Helper that ensures the state of *this is such that one may modify the m_can and m_want socket sets.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00673">event_set.cpp:673</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a976144f6e525190344eb4e51620f9fd9"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a976144f6e525190344eb4e51620f9fd9">flow::net_flow::Event_set::events_wanted</a></div><div class="ttdeci">bool events_wanted(Error_code *err_code=0) const</div><div class="ttdoc">Returns true if and only if at least one wanted event for at least one socket is registered (via add_...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00551">event_set.cpp:551</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_a9ae292072a84d07c867536e3de3b878e"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#a9ae292072a84d07c867536e3de3b878e">flow::net_flow::Event_set::close</a></div><div class="ttdeci">void close(Error_code *err_code=0)</div><div class="ttdoc">Clears all stored resources (any desired events, result events, and any handler saved by async_wait()...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00463">event_set.cpp:463</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_aa321c69146b8575e4d0e3b15c67d4f08"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#aa321c69146b8575e4d0e3b15c67d4f08">flow::net_flow::Event_set::S_EV_TYPE_TO_IS_ACTIVE_NODE_MTD</a></div><div class="ttdeci">static const boost::unordered_map&lt; Event_type, Function&lt; bool(const Node *, const boost::any &amp;)&gt; &gt; S_EV_TYPE_TO_IS_ACTIVE_NODE_MTD</div><div class="ttdoc">Mapping from each possible Event_type to the Node method that determines whether the condition define...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00897">event_set.hpp:897</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_aafa4275ad4f93ae274f7f88fd257ce33"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#aafa4275ad4f93ae274f7f88fd257ce33">flow::net_flow::Event_set::node</a></div><div class="ttdeci">Node * node() const</div><div class="ttdoc">Node that produced this Event_set.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00066">event_set.cpp:66</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_ab64e128595b701e37256ff79d782c146"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#ab64e128595b701e37256ff79d782c146">flow::net_flow::Event_set::clear</a></div><div class="ttdeci">bool clear(Error_code *err_code=0)</div><div class="ttdoc">Forgets all sockets stored in this object in any fashion.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00703">event_set.cpp:703</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_abf8a102c621b1536659973b2d6b33822"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#abf8a102c621b1536659973b2d6b33822">flow::net_flow::Event_set::m_can</a></div><div class="ttdeci">Ev_type_to_socks_map m_can</div><div class="ttdoc">The sockets, categorized by Event_type of interest, that were found to be &quot;ready&quot; (as defined in the ...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00920">event_set.hpp:920</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_accb662e50999e2d0800f59a7a131bffa"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#accb662e50999e2d0800f59a7a131bffa">flow::net_flow::Event_set::~Event_set</a></div><div class="ttdeci">~Event_set()</div><div class="ttdoc">Boring destructor. Note that deletion is to be handled exclusively via shared_ptr,...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00054">event_set.cpp:54</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_ada8d103341b6450f3390dc6ce24ccdef"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#ada8d103341b6450f3390dc6ce24ccdef">flow::net_flow::Event_set::m_baseline_check_pending</a></div><div class="ttdeci">bool m_baseline_check_pending</div><div class="ttdoc">While in State::S_WAITING, if this is true, an exhaustive check of all desired events is yet to be pe...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00934">event_set.hpp:934</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_ae04c117b15179ba37a94f6836c63497b"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#ae04c117b15179ba37a94f6836c63497b">flow::net_flow::Event_set::sock_as_any_to_str</a></div><div class="ttdeci">static std::string sock_as_any_to_str(const boost::any &amp;sock_as_any)</div><div class="ttdoc">Helper that returns a loggable string representing the socket stored in the given boost::any that sto...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00775">event_set.cpp:775</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_aebbf2b8f19e2b3d887fe234cd5bdcffc"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#aebbf2b8f19e2b3d887fe234cd5bdcffc">flow::net_flow::Event_set::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, Event_set::State state)</div><div class="ttdoc">Prints string representation of given Event_set state to given standard ostream and returns the latte...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l01507">event_set.cpp:1507</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_aed9505b886c78169fe35b527f4e01855"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#aed9505b886c78169fe35b527f4e01855">flow::net_flow::Event_set::ev_type_to_socks_map_entry_is_empty</a></div><div class="ttdeci">static bool ev_type_to_socks_map_entry_is_empty(const Ev_type_to_socks_map::Value &amp;ev_type_and_socks)</div><div class="ttdoc">Functional helper that checks whether a given pair in an Ev_type_to_socks_map contains an empty set o...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00754">event_set.cpp:754</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_af4fa5dbda4ffd95b35dee57fc01b90ce"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#af4fa5dbda4ffd95b35dee57fc01b90ce">flow::net_flow::Event_set::m_want</a></div><div class="ttdeci">Ev_type_to_socks_map m_want</div><div class="ttdoc">The sockets, categorized by Event_type of interest, to check for &quot;ready&quot; status (as defined in the do...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00910">event_set.hpp:910</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_af635301685a4a331142e1ac8a791a65d"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#af635301685a4a331142e1ac8a791a65d">flow::net_flow::Event_set::m_node</a></div><div class="ttdeci">Node * m_node</div><div class="ttdoc">See node(). Should be set before user gets access to *this. Must not be modified by non-W threads aft...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00904">event_set.hpp:904</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_afb6379c7fe127c26fd4cdc9752ccf9e2"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#afb6379c7fe127c26fd4cdc9752ccf9e2">flow::net_flow::Event_set::clear_result_sockets</a></div><div class="ttdeci">bool clear_result_sockets(Event_type ev_type, Error_code *err_code=0)</div><div class="ttdoc">Identical to emit_result_sockets(&amp;sockets, ev_type, err_code), where originally sockets is empty and ...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00647">event_set.cpp:647</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Event__set_html_affac46b4e327b3781faab4853a290877"><div class="ttname"><a href="classflow_1_1net__flow_1_1Event__set.html#affac46b4e327b3781faab4853a290877">flow::net_flow::Event_set::Ev_type_to_socks_map</a></div><div class="ttdeci">util::Linked_hash_map&lt; Event_type, Sockets &gt; Ev_type_to_socks_map</div><div class="ttdoc">Short-hand for type storing a set of socket sets – one per possible Event_type enum value.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8hpp_source.html#l00798">event_set.hpp:798</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html">flow::net_flow::Node</a></div><div class="ttdoc">An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...</div><div class="ttdef"><b>Definition:</b> <a href="node_8hpp_source.html#l00930">node.hpp:934</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a0756fc7301d0cfa66f19e681a9c60c06"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a0756fc7301d0cfa66f19e681a9c60c06">flow::net_flow::Node::sock_is_writable</a></div><div class="ttdeci">bool sock_is_writable(const boost::any &amp;sock_as_any) const</div><div class="ttdoc">Returns true if and only if calling sock-&gt;send() with at least some arguments would return either non...</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l04642">peer_socket.cpp:4642</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a1124027c715d674f113f2d961e4c6861"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a1124027c715d674f113f2d961e4c6861">flow::net_flow::Node::interrupt_all_waits</a></div><div class="ttdeci">void interrupt_all_waits(Error_code *err_code=0)</div><div class="ttdoc">Interrupts any blocking operation, a/k/a wait, and informs the invoker of that operation that the blo...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l01390">event_set.cpp:1390</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a2195fb7d86acfaf340b3e7e59e7e10e8"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a2195fb7d86acfaf340b3e7e59e7e10e8">flow::net_flow::Node::event_set_check_baseline</a></div><div class="ttdeci">bool event_set_check_baseline(Event_set::Ptr event_set)</div><div class="ttdoc">Checks each desired (Event_set::m_want) event in event_set; any that holds true is saved into event_s...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l01015">event_set.cpp:1015</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a44ee0d42d38f3b98d032dee1549f8c4c"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a44ee0d42d38f3b98d032dee1549f8c4c">flow::net_flow::Node::event_set_close</a></div><div class="ttdeci">void event_set_close(Event_set::Ptr event_set, Error_code *err_code)</div><div class="ttdoc">Implementation of Event_set::close() when Event_set::state() != Event_set::State::S_CLOSED for event_...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l01271">event_set.cpp:1271</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a4a21e69d3ae442b2cc06220514de364a"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a4a21e69d3ae442b2cc06220514de364a">flow::net_flow::Node::event_set_check_baseline_assuming_state</a></div><div class="ttdeci">void event_set_check_baseline_assuming_state(Event_set::Ptr event_set)</div><div class="ttdoc">Helper placed by event_set_async_wait() onto thread W to invoke event_set_check_baseline() but first ...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00987">event_set.cpp:987</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a51b26bff4cdf545f22d8edec7185c5c4"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a51b26bff4cdf545f22d8edec7185c5c4">flow::net_flow::Node::serv_is_acceptable</a></div><div class="ttdeci">bool serv_is_acceptable(const boost::any &amp;serv_as_any) const</div><div class="ttdoc">Returns true if and only if calling serv-&gt;accept() with at least some arguments would return either n...</div><div class="ttdef"><b>Definition:</b> <a href="server__socket_8cpp_source.html#l00339">server_socket.cpp:339</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a6727ca42e15c8627c1ed3d94e6dd7a53"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a6727ca42e15c8627c1ed3d94e6dd7a53">flow::net_flow::Node::event_set_close_worker</a></div><div class="ttdeci">void event_set_close_worker(Event_set::Ptr event_set)</div><div class="ttdoc">The guts of event_set_close_worker_check_state(): same thing, but assumes Event_set::state() == Event...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l01330">event_set.cpp:1330</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_a8a4ddf81ddbeab1f740940c4cc0d3625"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#a8a4ddf81ddbeab1f740940c4cc0d3625">flow::net_flow::Node::event_set_all_check_delta</a></div><div class="ttdeci">void event_set_all_check_delta(bool defer_delta_check)</div><div class="ttdoc">For each WAITING Event_set within the Node: checks for any events that hold, and if any do hold,...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l01127">event_set.cpp:1127</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_aa18a14a4749f34d07c71bb2a1214d65f"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#aa18a14a4749f34d07c71bb2a1214d65f">flow::net_flow::Node::event_set_async_wait</a></div><div class="ttdeci">bool event_set_async_wait(Event_set::Ptr event_set, const Event_set::Event_handler &amp;on_event, Error_code *err_code)</div><div class="ttdoc">Implementation of Event_set::async_wait() when Event_set::state() == Event_set::State::S_INACTIVE.</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00915">event_set.cpp:915</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_aa44feae2c97b4bc1fe1f14f83e932d84"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#aa44feae2c97b4bc1fe1f14f83e932d84">flow::net_flow::Node::sock_is_readable</a></div><div class="ttdeci">bool sock_is_readable(const boost::any &amp;sock_as_any) const</div><div class="ttdoc">Returns true if and only if calling sock-&gt;receive() with at least some arguments would return either ...</div><div class="ttdef"><b>Definition:</b> <a href="peer__socket_8cpp_source.html#l05157">peer_socket.cpp:5157</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ad100464cf0126dbbad39bde1c90a774f"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ad100464cf0126dbbad39bde1c90a774f">flow::net_flow::Node::event_set_create</a></div><div class="ttdeci">Event_set::Ptr event_set_create(Error_code *err_code=0)</div><div class="ttdoc">Creates a new Event_set in Event_set::State::S_INACTIVE state with no sockets/events stored; returns ...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l00879">event_set.cpp:879</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ad2840a7a95f16b7e222e449e3d6b9aca"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ad2840a7a95f16b7e222e449e3d6b9aca">flow::net_flow::Node::interrupt_all_waits_worker</a></div><div class="ttdeci">void interrupt_all_waits_worker()</div><div class="ttdoc">Thread W implementation of interrupt_all_waits().</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l01419">event_set.cpp:1419</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_ae996cab95eb139d00f0d430093e64a5f"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#ae996cab95eb139d00f0d430093e64a5f">flow::net_flow::Node::interrupt_all_waits_internal_sig_handler</a></div><div class="ttdeci">void interrupt_all_waits_internal_sig_handler(const Error_code &amp;sys_err_code, int sig_number)</div><div class="ttdoc">signal_set handler, executed on SIGINT and SIGTERM, if user has enabled this feature: causes interrup...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l01454">event_set.cpp:1454</a></div></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Node_html_afdefbbb3c3b9f2f2866f6b4c770fa62d"><div class="ttname"><a href="classflow_1_1net__flow_1_1Node.html#afdefbbb3c3b9f2f2866f6b4c770fa62d">flow::net_flow::Node::event_set_fire_if_got_events</a></div><div class="ttdeci">void event_set_fire_if_got_events(Event_set::Ptr event_set)</div><div class="ttdoc">Check whether given Event_set contains any active sockets (Event_set::m_can); if so,...</div><div class="ttdef"><b>Definition:</b> <a href="event__set_8cpp_source.html#l01082">event_set.cpp:1082</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Container__traits_html"><div class="ttname"><a href="classflow_1_1util_1_1Container__traits.html">flow::util::Container_traits</a></div><div class="ttdoc">Properties of various container types.</div><div class="ttdef"><b>Definition:</b> <a href="traits_8hpp_source.html#l00042">traits.hpp:43</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Linked__hash__map_html"><div class="ttname"><a href="classflow_1_1util_1_1Linked__hash__map.html">flow::util::Linked_hash_map&lt; Event_type, Sockets &gt;</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Linked__hash__map_html_aba0949de5032e8dd6d75a48bcac9b060"><div class="ttname"><a href="classflow_1_1util_1_1Linked__hash__map.html#aba0949de5032e8dd6d75a48bcac9b060">flow::util::Linked_hash_map::size</a></div><div class="ttdeci">size_type size() const</div><div class="ttdoc">Returns number of elements stored.</div><div class="ttdef"><b>Definition:</b> <a href="linked__hash__map_8hpp_source.html#l01070">linked_hash_map.hpp:1070</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Linked__hash__set_html"><div class="ttname"><a href="classflow_1_1util_1_1Linked__hash__set.html">flow::util::Linked_hash_set</a></div><div class="ttdoc">An object of this class is a set that combines the lookup speed of an unordered_set&lt;&gt; and ordering an...</div><div class="ttdef"><b>Definition:</b> <a href="linked__hash__set_8hpp_source.html#l00047">linked_hash_set.hpp:48</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Linked__hash__set_html_a048a8d78c4ae3bc45c8bcede6b0e2dc6"><div class="ttname"><a href="classflow_1_1util_1_1Linked__hash__set.html#a048a8d78c4ae3bc45c8bcede6b0e2dc6">flow::util::Linked_hash_set::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdoc">Returns true if and only if container is empty.</div><div class="ttdef"><b>Definition:</b> <a href="linked__hash__set_8hpp_source.html#l00858">linked_hash_set.hpp:858</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Linked__hash__set_html_a46e27b1b9b75e5dc890af26f85956190"><div class="ttname"><a href="classflow_1_1util_1_1Linked__hash__set.html#a46e27b1b9b75e5dc890af26f85956190">flow::util::Linked_hash_set::swap</a></div><div class="ttdeci">void swap(Linked_hash_set &amp;other)</div><div class="ttdoc">Swaps the contents of this structure and other.</div><div class="ttdef"><b>Definition:</b> <a href="linked__hash__set_8hpp_source.html#l00729">linked_hash_set.hpp:729</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Linked__hash__set_html_a517b9b0ac9d6ab2c56e27ba380f87180"><div class="ttname"><a href="classflow_1_1util_1_1Linked__hash__set.html#a517b9b0ac9d6ab2c56e27ba380f87180">flow::util::Linked_hash_set::insert</a></div><div class="ttdeci">std::pair&lt; Iterator, bool &gt; insert(Value const &amp;key)</div><div class="ttdoc">Attempts to insert the given key into the set.</div><div class="ttdef"><b>Definition:</b> <a href="linked__hash__set_8hpp_source.html#l00591">linked_hash_set.hpp:591</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Linked__hash__set_html_a8844c7594a079eb2d52d78436ed832c6"><div class="ttname"><a href="classflow_1_1util_1_1Linked__hash__set.html#a8844c7594a079eb2d52d78436ed832c6">flow::util::Linked_hash_set::clear</a></div><div class="ttdeci">void clear()</div><div class="ttdoc">Makes it so that size() == 0.</div><div class="ttdef"><b>Definition:</b> <a href="linked__hash__set_8hpp_source.html#l00722">linked_hash_set.hpp:722</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Linked__hash__set_html_ad2ce3ff8f57696dcb230f419775ab865"><div class="ttname"><a href="classflow_1_1util_1_1Linked__hash__set.html#ad2ce3ff8f57696dcb230f419775ab865">flow::util::Linked_hash_set::size</a></div><div class="ttdeci">size_type size() const</div><div class="ttdoc">Returns number of elements stored.</div><div class="ttdef"><b>Definition:</b> <a href="linked__hash__set_8hpp_source.html#l00852">linked_hash_set.hpp:852</a></div></div>
<div class="ttc" id="aclassflow_1_1util_1_1Shared__ptr__alias__holder_html_aa4f1af88393042e60159a3a67f0accbc"><div class="ttname"><a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">flow::util::Shared_ptr_alias_holder&lt; boost::shared_ptr&lt; Peer_socket &gt; &gt;::Ptr</a></div><div class="ttdeci">boost::shared_ptr&lt; Peer_socket &gt; Ptr</div><div class="ttdoc">Short-hand for ref-counted pointer to mutable values of type Target_type::element_type (a-la T*).</div><div class="ttdef"><b>Definition:</b> <a href="shared__ptr__alias__holder_8hpp_source.html#l00125">shared_ptr_alias_holder.hpp:125</a></div></div>
<div class="ttc" id="aerror_2error_8hpp_html_a019ee6e90802e444572dd78d312d6e23"><div class="ttname"><a href="error_2error_8hpp.html#a019ee6e90802e444572dd78d312d6e23">FLOW_ERROR_SYS_ERROR_LOG_WARNING</a></div><div class="ttdeci">#define FLOW_ERROR_SYS_ERROR_LOG_WARNING()</div><div class="ttdoc">Logs a warning about the (often errno-based or from a library) error code in sys_err_code.</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00269">error.hpp:269</a></div></div>
<div class="ttc" id="aerror_2error_8hpp_html_a636b2d30a8785df6e84646b568bce9b5"><div class="ttname"><a href="error_2error_8hpp.html#a636b2d30a8785df6e84646b568bce9b5">FLOW_ERROR_EXEC_AND_THROW_ON_ERROR</a></div><div class="ttdeci">#define FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(ARG_ret_type, ARG_function_name,...)</div><div class="ttdoc">Narrow-use macro that implements the error code/exception semantics expected of most public-facing Fl...</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00363">error.hpp:363</a></div></div>
<div class="ttc" id="aerror_2error_8hpp_html_ab6b8ed79012c994cfc381e0b92c066fd"><div class="ttname"><a href="error_2error_8hpp.html#ab6b8ed79012c994cfc381e0b92c066fd">FLOW_ERROR_EMIT_ERROR</a></div><div class="ttdeci">#define FLOW_ERROR_EMIT_ERROR(ARG_val)</div><div class="ttdoc">Sets *err_code to ARG_val and logs a warning about the error using FLOW_LOG_WARNING().</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00202">error.hpp:202</a></div></div>
<div class="ttc" id="alog_8hpp_html_a325fdd4b5cf0be49b37d3b7b7c29070d"><div class="ttname"><a href="log_8hpp.html#a325fdd4b5cf0be49b37d3b7b7c29070d">FLOW_LOG_INFO</a></div><div class="ttdeci">#define FLOW_LOG_INFO(ARG_stream_fragment)</div><div class="ttdoc">Logs an INFO message into flow::log::Logger *get_logger() with flow::log::Component get_log_component...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00197">log.hpp:197</a></div></div>
<div class="ttc" id="alog_8hpp_html_a626c7dc4d3b4dc0b32a8aac8624d66bc"><div class="ttname"><a href="log_8hpp.html#a626c7dc4d3b4dc0b32a8aac8624d66bc">FLOW_LOG_WARNING</a></div><div class="ttdeci">#define FLOW_LOG_WARNING(ARG_stream_fragment)</div><div class="ttdoc">Logs a WARNING message into flow::log::Logger *get_logger() with flow::log::Component get_log_compone...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00152">log.hpp:152</a></div></div>
<div class="ttc" id="alog_8hpp_html_affcf2e4c496ce3f42adf981669c623b8"><div class="ttname"><a href="log_8hpp.html#affcf2e4c496ce3f42adf981669c623b8">FLOW_LOG_TRACE</a></div><div class="ttdeci">#define FLOW_LOG_TRACE(ARG_stream_fragment)</div><div class="ttdoc">Logs a TRACE message into flow::log::Logger *get_logger() with flow::log::Component get_log_component...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00227">log.hpp:227</a></div></div>
<div class="ttc" id="anamespaceflow_1_1async_html_a0a06794b16b72f2829ce3353557c8485"><div class="ttname"><a href="namespaceflow_1_1async.html#a0a06794b16b72f2829ce3353557c8485">flow::async::Synchronicity</a></div><div class="ttdeci">Synchronicity</div><div class="ttdoc">Enumeration indicating the manner in which asio_exec_ctx_post(), and various boost....</div><div class="ttdef"><b>Definition:</b> <a href="async__fwd_8hpp_source.html#l00222">async_fwd.hpp:223</a></div></div>
<div class="ttc" id="anamespaceflow_1_1async_html_a24567271e97a67d3cae6bd8bf8dc63c4"><div class="ttname"><a href="namespaceflow_1_1async.html#a24567271e97a67d3cae6bd8bf8dc63c4">flow::async::asio_exec_ctx_post</a></div><div class="ttdeci">void asio_exec_ctx_post(log::Logger *logger_ptr, Execution_context *exec_ctx, Synchronicity synchronicity, Task &amp;&amp;task)</div><div class="ttdoc">An extension of boost.asio's post() and dispatch() free function templates, this free function templa...</div><div class="ttdef"><b>Definition:</b> <a href="async_2util_8hpp_source.html#l00031">util.hpp:31</a></div></div>
<div class="ttc" id="anamespaceflow_1_1error_html_a48afa7f8c2e100acd461365dfb00a114"><div class="ttname"><a href="namespaceflow_1_1error.html#a48afa7f8c2e100acd461365dfb00a114">flow::error::exec_void_and_throw_on_error</a></div><div class="ttdeci">bool exec_void_and_throw_on_error(const Func &amp;func, Error_code *err_code, util::String_view context)</div><div class="ttdoc">Equivalent of exec_and_throw_on_error() for operations with void return type.</div><div class="ttdef"><b>Definition:</b> <a href="error_2error_8hpp_source.html#l00168">error.hpp:168</a></div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_1_1error_html_a18e13de77b119ea0f2be411490859482a3e273da0f7d2f231dbfaab8d07fd5ecd"><div class="ttname"><a href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482a3e273da0f7d2f231dbfaab8d07fd5ecd">flow::net_flow::error::Code::S_EVENT_SET_RESULT_CHECK_WHEN_WAITING</a></div><div class="ttdeci">@ S_EVENT_SET_RESULT_CHECK_WHEN_WAITING</div><div class="ttdoc">Attempted to check wait results while still waiting.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_1_1error_html_a18e13de77b119ea0f2be411490859482a3f2c29ade2454001982c033a37fd9c79"><div class="ttname"><a href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482a3f2c29ade2454001982c033a37fd9c79">flow::net_flow::error::Code::S_EVENT_SET_IMMUTABLE_WHEN_WAITING</a></div><div class="ttdeci">@ S_EVENT_SET_IMMUTABLE_WHEN_WAITING</div><div class="ttdoc">Attempted to write to an event set, while a wait operation was pending on that event set.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_1_1error_html_a18e13de77b119ea0f2be411490859482a5cbb0762dc20632c76db479f40237492"><div class="ttname"><a href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482a5cbb0762dc20632c76db479f40237492">flow::net_flow::error::Code::S_EVENT_SET_NO_EVENTS</a></div><div class="ttdeci">@ S_EVENT_SET_NO_EVENTS</div><div class="ttdoc">Attempted to wait on an event set without specifying event on which to wait.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_1_1error_html_a18e13de77b119ea0f2be411490859482ab92ec3b2b78d74acf0fda0786f601df5"><div class="ttname"><a href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ab92ec3b2b78d74acf0fda0786f601df5">flow::net_flow::error::Code::S_WAIT_INTERRUPTED</a></div><div class="ttdeci">@ S_WAIT_INTERRUPTED</div><div class="ttdoc">A blocking (sync_) or background-blocking (async_) operation was interrupted, such as by a signal.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_1_1error_html_a18e13de77b119ea0f2be411490859482adccb025a96014a74a1435481ec2b58ac"><div class="ttname"><a href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482adccb025a96014a74a1435481ec2b58ac">flow::net_flow::error::Code::S_EVENT_SET_DOUBLE_WAIT_OR_POLL</a></div><div class="ttdeci">@ S_EVENT_SET_DOUBLE_WAIT_OR_POLL</div><div class="ttdoc">Attempted to wait on or poll an event set while already waiting on that event set.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_1_1error_html_a18e13de77b119ea0f2be411490859482ae643fd244bd1d6b483295cb9f356b0ae"><div class="ttname"><a href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482ae643fd244bd1d6b483295cb9f356b0ae">flow::net_flow::error::Code::S_EVENT_SET_CLOSED</a></div><div class="ttdeci">@ S_EVENT_SET_CLOSED</div><div class="ttdoc">Attempted operation on an event set, when that event set was closed.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_1_1error_html_a18e13de77b119ea0f2be411490859482affac5d80b4e72f2e55bbbfadce2efd2e"><div class="ttname"><a href="namespaceflow_1_1net__flow_1_1error.html#a18e13de77b119ea0f2be411490859482affac5d80b4e72f2e55bbbfadce2efd2e">flow::net_flow::error::Code::S_NODE_NOT_RUNNING</a></div><div class="ttdeci">@ S_NODE_NOT_RUNNING</div><div class="ttdoc">Node not running.</div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_html"><div class="ttname"><a href="namespaceflow_1_1net__flow.html">flow::net_flow</a></div><div class="ttdoc">Flow module containing the API and implementation of the Flow network protocol, a TCP-inspired stream...</div><div class="ttdef"><b>Definition:</b> <a href="asio_2node_8cpp_source.html#l00024">node.cpp:25</a></div></div>
<div class="ttc" id="anamespaceflow_1_1util_html_a03984e29450abf9cf287c501d6c8f866"><div class="ttname"><a href="namespaceflow_1_1util.html#a03984e29450abf9cf287c501d6c8f866">flow::util::key_exists</a></div><div class="ttdeci">bool key_exists(const Container &amp;container, const typename Container::key_type &amp;key)</div><div class="ttdoc">Returns true if and only if the given key is present at least once in the given associative container...</div><div class="ttdef"><b>Definition:</b> <a href="util_2util_8hpp_source.html#l00301">util.hpp:301</a></div></div>
<div class="ttc" id="anamespaceflow_1_1util_html_a8afd30c50bcd670d45442df49d1da484"><div class="ttname"><a href="namespaceflow_1_1util.html#a8afd30c50bcd670d45442df49d1da484">flow::util::ostream_op_to_string</a></div><div class="ttdeci">void ostream_op_to_string(std::string *target_str, T const &amp;... ostream_args)</div><div class="ttdoc">Writes to the specified string, as if the given arguments were each passed, via &lt;&lt; in sequence,...</div><div class="ttdef"><b>Definition:</b> <a href="util_2util_8hpp_source.html#l00367">util.hpp:367</a></div></div>
<div class="ttc" id="anamespaceflow_html_a29eaaa9d0fac4ce87d8b969222dbed09"><div class="ttname"><a href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">flow::Error_code</a></div><div class="ttdeci">boost::system::error_code Error_code</div><div class="ttdoc">Short-hand for a boost.system error code (which basically encapsulates an integer/enum error code and...</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00508">common.hpp:508</a></div></div>
<div class="ttc" id="anamespaceflow_html_a3938730ab4b89daf13d027a5f620e7ce"><div class="ttname"><a href="namespaceflow.html#a3938730ab4b89daf13d027a5f620e7ce">flow::Flow_log_component</a></div><div class="ttdeci">Flow_log_component</div><div class="ttdoc">The flow::log::Component payload enumeration comprising various log components used by Flow's own int...</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00637">common.hpp:638</a></div></div>
<div class="ttc" id="anamespaceflow_html_a48799f1263cdeedec125be51a3db2b79"><div class="ttname"><a href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">flow::Fine_duration</a></div><div class="ttdeci">Fine_clock::duration Fine_duration</div><div class="ttdoc">A high-res time duration as computed from two Fine_time_pts.</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00416">common.hpp:416</a></div></div>
<div class="ttc" id="anode_8hpp_html"><div class="ttname"><a href="node_8hpp.html">node.hpp</a></div></div>
<div class="ttc" id="apeer__socket_8hpp_html"><div class="ttname"><a href="peer__socket_8hpp.html">peer_socket.hpp</a></div></div>
<div class="ttc" id="aserver__socket_8hpp_html"><div class="ttname"><a href="server__socket_8hpp.html">server_socket.hpp</a></div></div>
<div class="ttc" id="autil__fwd_8hpp_html_a0cc4c82ac54e53b7a8a2431b66ff30df"><div class="ttname"><a href="util__fwd_8hpp.html#a0cc4c82ac54e53b7a8a2431b66ff30df">FLOW_UTIL_WHERE_AM_I_STR</a></div><div class="ttdeci">#define FLOW_UTIL_WHERE_AM_I_STR()</div><div class="ttdoc">Same as FLOW_UTIL_WHERE_AM_I() but evaluates to an std::string.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00971">util_fwd.hpp:971</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:35 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
